我正在尝试将EJB注入Spring(3.1.2)服务(两者都在不同的 WAR中) 两者都非常简单(删除方法以简化示例):
EJB:
@Remote
public interface MyBean {
}
@Singleton
public class MyBeanImpl implements MyBean{
}
服务:
@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;
和
@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" />
在我的弹簧配置和服务中:
@Autowired
private MyBean myBean;
但我真的不喜欢这个解决方案。我想在一些注释中使用我的JNDI路径,例如:
@EJB(lookup = MyBean.JNDI_NAME)
private MyBean myBean;
答案 0 :(得分:8)
我们找到了非常好的简单解决方案。 进入spring配置文件,必须放入:
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
<property name="alwaysUseJndiLookup" value="true" />
</bean>
这使spring能够在JNDI中搜索使用@Resource注释的 beans 。 所以现在可以做到:
@Resource(mappedName = MyBean.JNDI_NAME)
private MyBean myBean;
答案 1 :(得分:0)
您的目标是摆脱XML还是在注释中使用JNDI名称?如果是前者,我还没有测试过,但是应该可以工作:
@Configuration
public class EjbCfg {
@Bean
public JndiObjectFactoryBean myBean() {
JndiObjectFactoryBean factory = new JndiObjectFactoryBean();
factory.setJndiName(MyBean.JNDI_NAME);
return factory;
}
}
现在你可以简单地注入:
@Autowired
private MyBean myBean;