混合Spring MVC和CDI / JEE6的最佳方法是什么?

时间:2010-10-25 22:41:01

标签: jboss java-ee-6 glassfish-3 cdi

我不是JSF的粉丝。 Spring MVC对我来说很有意义,我过去也曾使用它。

你能不能把它说出来,或提供将它很好地融入JEE6并与CDI分享和陷阱的技巧。

我不介意只为MVC提供应用程序上下文,但是如果我在我的MVC控制器中使用@Inject或@EJB,会出现什么问题呢?

Seam3看起来很有趣但是它已经准备好投入生产了吗?

3 个答案:

答案 0 :(得分:3)

另一种选择是使用JAX-RS作为控制器(使用Jersey实现,您可以将控制权转发给JSP),并使用JSP作为您的视图。这样您就不必担心将Spring与Java EE集成。

例如,你可以有一个HomeController:

@Path("/")
@Stateless
public class HomeController {

    @Context
    HttpRequest request; // Injects request object so you set attributes.

    @EJB // Inject your EJB
    EmployeeServiceLocal employeeService;

    @GET
    public Viewable getHomePage() {

        Employee employee = employeeService.getEmployee();
        request.setAttribute("employee", employee);
        return new Viewable("/home.jsp", null);
    }
}

这将引导您进入名为home.jsp的JSP,并且您将能够通过请求对象获取JSP上的数据。请注意,JAX-RS用于RESTful Web服务,因此要了解下面代码中发生的情况,您必须了解REST。

答案 1 :(得分:2)

  

你能说出来吗或提供将它很好地融入JEE6并与CDI分享和陷阱的技巧

也许我错了,但我认为你不得不在CDI和Spring的DI部分之间做出选择,其中一个必须负责创建魔法发生的对象。因此,如果您想将CDI与Spring MVC一起使用,您必须制作控制器CDI bean。来自JavaOne 2010 : Java EE 6 Panel "What do we do now?" notes

  

SpringMVC和CDI? =>技术上可行:使用CDI bean作为控制器(但Reza表示他们没有看到对SpringMVC做足够的工作需求)。

我也热烈建议您查看Java EE 6 (CDI / EJB 3.1) XOR Spring Core Reloaded

  

我不介意只为MVC提供应用程序上下文,但是如果我在我的MVC控制器中使用@Inject或@EJB,会出现什么问题呢?

Spring提供了内置的support of "at inject" from JSR-330,并为@EJB提供了一些魔力。如果这就是你想要的,那么Spring会起作用。但这不是CDI(JSR-299)给你的。

答案 2 :(得分:1)

Using CDI from Spring解释了如何使用BeanFactoryPostProcessor构建CDI-to-Spring桥接器,该桥接器将所有bean从CDI BeanManager导入Spring应用程序上下文。

Pascal说你必须在Spring DI和CDI之间做出选择,但是通过这种方法你可以选择每个模块

在典型的WAR布局中,有一个Web模块在WEB-INF / lib中使用了许多服务和持久性模块。使用CDI-to-Spring桥,您可以将WEB-INF / lib模块转换为CDI bean存档,而Web模块是一个bean存档,只使用Spring DI。

网桥通过JNDI访问CDI BeanManager,并为每个CDI bean创建一个Spring工厂bean。

我正在为您的用例精确地使用这个桥:将Spring MVC Web前端与Java EE 6后端集成。