3

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

你能说服我放弃它或提供将它很好地集成到 JEE6 并与 CDI 共享和陷阱的提示。

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

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

4

3 回答 3

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。

于 2010-11-08T15:08:21.250 回答
2

你能说服我放弃它或提供将它很好地集成到 JEE6 并与 CDI 共享和陷阱的提示吗

也许我错了,但我认为您必须以某种方式在 CDI 和 Spring 的 DI 部分之间做出选择,其中一个必须负责创建对象以使魔术发生。所以如果你想在 Spring MVC 中使用 CDI,你必须让你的控制器 CDI bean。来自JavaOne 2010:Java EE 6 面板“我们现在做什么?” 笔记

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

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

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

Spring 提供了对来自 JSR-330 的“at injection”的内置支持,并且还为 @EJB 提供了一些魔力。如果这就是您要寻找的全部,那么 Spring 将起作用。但这不是 CDI (JSR-299) 给你的。

于 2010-10-25T23:50:30.717 回答
1

从 Spring 中使用 CDI解释了如何使用 BeanFactoryPostProcessor 构建 CDI 到 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。

I'm using this bridge precisely for your use case: Integrating a Spring MVC web frontend with a Java EE 6 backend.

于 2011-06-07T21:25:53.380 回答