使用没有mappedName的Spring MVC 3.0和@EJB注释?

时间:2011-10-21 01:58:06

标签: spring model-view-controller ejb

我正在使用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批注,唯一的区别是哪个框架正在创建对象并进行注入。

2 个答案:

答案 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;