使用 Spring MVC 3.0 和 @EJB 注释而没有映射名称?
Posted
技术标签:
【中文标题】使用 Spring MVC 3.0 和 @EJB 注释而没有映射名称?【英文标题】:Using Spring MVC 3.0 and @EJB annotation wtihout mappedName? 【发布时间】:2011-12-12 06:05:55 【问题描述】:我正在使用 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 注释,唯一的区别是创建对象和执行注入的框架。
【问题讨论】:
【参考方案1】:如果你使用
mappedName="java:module/Service"
而不是
mappedName="java:global/springtest/Service"
您不必担心应用程序名称。 这使代码更具可移植性。我想这会解决你的一些问题
【讨论】:
【参考方案2】:对于 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;
【讨论】:
这只是将问题推到 XML 上,这让 IMO 感觉更糟。 @wrschneider99 为什么?你想摆脱 mappedName 参数,所以你得到了它。那不是问题吗?否则,您可以在代码中进行 JNDI 查找,这将是完全可移植的,但很难看。 我希望 JNDI 查找可以通过某种方式按照约定进行,这样就不需要显式的 mappedName。或者,如果有必要,我不介意将配置推送到无状态注释,以利用 Spring 对 EJB 注释的解释固有的任何默认值。以上是关于使用 Spring MVC 3.0 和 @EJB 注释而没有映射名称?的主要内容,如果未能解决你的问题,请参考以下文章