什么是混合Spring MVC和CDI / JEE6的最佳方式?
-
26-09-2019 - |
题
我不是JSF的风扇。 Spring MVC的使得很多的意义,我,我已经在过去使用它。
你能说服我放弃它还是提供了很好的将其集成到JEE6和共享,并与陷阱CDI提示。
我不介意只是为MVC的东西,但如果我使用@Inject或在我的MVC控制器的应用程序上下文@EJB,这是怎么回事去错?
Seam3看起来有趣,虽然是为生产做好准备?
解决方案
你能说服我放弃它还是提供了很好的将其集成到JEE6技巧和份额,并与陷阱CDI
也许我错了,但我认为你无论如何都必须使CDI和Spring的DI部分之间进行选择,它们中的一个负责创建要发生的神奇对象。所以,如果你想使用CDI与Spring MVC的,你必须让你的控制器CDI豆。从的JavaOne 2010: “什么?难道我们现在做的” Java EE 6的面板说明:
和用SpringMVC CDI? =>技术上是可行的:使用CDI bean作为控制器(但礼萨说,他们看到的并不是不够用SpringMVC需求做的工作)。
我也热烈建议看看的Java EE 6(CDI / EJB 3.1)XOR弹簧芯重装上阵。
我不介意只是为MVC的东西,但如果我使用@Inject或在我的MVC控制器的应用程序上下文@EJB,这是怎么回事去错?
弹簧提供了内置的支持的“在注入”从JSR-330 ,并还提供了一些魔法@EJB。如果这是你正在寻找所有,Spring会工作。但是,这只是不是CDI(JSR-299)给你。
其他提示
另一种选择是使用JAX-RS作为控制器(使用Jersey实现你可以转发控制到JSP),并使用JSP对你的看法。这样,您就不必担心与Java EE的集成Spring。
例如,可以有一个的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);
}
}
这将引导您进入一个JSP叫回到Home.jsp,你将能够通过请求对象来获取对JSP您的数据。请注意,JAX-RS用于REST Web服务,所以要了解什么是要去下面的代码中,你就必须有REST的理解。
从春季使用CDI 解释了如何构建一个CDI到弹簧桥用的BeanFactoryPostProcessor其进口所有豆来自CDI BeanManager成Spring应用程序上下文。
帕斯卡说得很对,你必须做出春DI和CDI之间的选择,但这种方法可以使选择的每个模块的。
在一个典型布局WAR,有使用在WEB-INF / lib中的若干服务和持久性模块中的一个web模块。随着CDI对春桥,你可以打开WEB-INF / lib目录模块插入CDI豆档案,而Web模块的不的一个bean存档,仅使用了Spring DI。
在桥访问通过JNDI的CDI BeanManager并创建一个Spring工厂bean每个CDI豆。
我使用这个桥正是因为你的使用情况:集成与Java EE 6的后端一个Spring MVC的Web前端
。