我试图将EJB注入到Spring(3.1.2)服务中(都在不同的 WAR中)两者都非常简单(删除了方法以简化示例):
EJB:
@Remote public interface MyBean { } @Singleton public class MyBeanImpl implements MyBean{ }
Service:
@Service public class MyServiceImpl implements MyService{ }
事情很简单,但我尝试过:
@EJB(lookup = "java:global/ejbApp/MyBeanImpl!com.my.MyBean") private MyBean myBean;
它没有用。然后我还尝试了:
@EJB(mappedName = "java:global/ejbApp/MyBeanImpl!com.my.MyBean") private MyBean myBean;
and
@Resource(mappedName = "java:global/ejbApp/MyBeanImpl!com.my.MyBean") private MyBean myBean;
但都没有奏效。
我设法使用以下方法注入了EJB:
<jee:jndi-lookup id="myBean" jndi-name="java:global/ejbApp/MyBeanImpl!com.my.MyBean" />
在我的spring配置和服务中:
@Autowired private MyBean myBean;
但我真的不喜欢这种解决方案。我希望在某些注释中包含我的JNDI路径,例如:
@EJB(lookup = MyBean.JNDI_NAME) private MyBean myBean;
我们找到了非常好的简单解决方案。放入spring配置文件中必须放入:
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> <property name="alwaysUseJndiLookup" value="true" /> </bean>
这样一来,spring就能在JNDI中搜索以@Resource注释的bean。因此,现在可以做到:
@Resource(mappedName = MyBean.JNDI_NAME) private MyBean myBean;