使用 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 注释而没有映射名称?的主要内容,如果未能解决你的问题,请参考以下文章

关于spring mvc 3.0注解,注入失败的问题

springmvc 3.0啥时间发部

请推荐用于 Spring MVC 3.0 的导航策略

Spring MVC 从 2.5 到 3.0

Spring MVC 和 Servlets 3.0 - 你还需要 web.xml 吗?

Spring 3.0 MVC 绑定枚举大小写敏感