我正在使用Spring MVC 3.0创建一个新的Java webapp,并希望尽可能多地使用标准的Java EE 6。 (我在Glassfish 3.1.1上。)真正的驱动程序想要使用MVC Web框架而不是JSF。
所以我正在寻找将EJB注入Spring控制器的最佳方法。我取得了一些成功,但我对它的外观并不满意,我希望找到更好的方法。
这可以通过JNDI找到EJB来实现:
// EJB
@Stateless
public class Service {
@PersistenceContext(name="MAIN")
private EntityManager em;
public void doSomething() { .... }
}
// Spring
@Controller
public class HomeController {
@EJB(mappedName="java:global/springtest/Service")
private Service service;
// controller methods use service
}
但我对控制器中@EJB注释需要“mappedName”感到不满。
有更好的方法吗?
但好消息是,我可以在EJB和Spring bean中使用相同的@Inject批注,唯一的区别是哪个框架正在创建对象并进行注入。
答案 0 :(得分:2)
如果您使用
mappedName="java:module/Service"
而不是
mappedName="java:global/springtest/Service"
您不必担心appname。 这使代码更具可移植性。我想这会解决你的一些问题
答案 1 :(得分:-1)
对于Spring,您可以将JNDI查找包装到JndiObjectFactoryBean
:
<bean id="serviceBean" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:global/springtest/Service" />
<property name="resourceRef" value="true" />
</bean>
然后你可能(如果我错了,请纠正我)能够使用@Inject
而不用 @Named("serviceBean")
注释:
@Inject
private Service service;