【问题标题】:Using Spring MVC 3.0 and @EJB annotation wtihout mappedName?使用 Spring MVC 3.0 和 @EJB 注释而没有映射名称?
【发布时间】: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 注释,唯一的区别是创建对象和执行注入的框架。

【问题讨论】:

    标签: spring model-view-controller ejb


    【解决方案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 注释的解释固有的任何默认值。
      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多