7

我正在尝试将 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" />

在我的 spring 配置和服务中:

@Autowired
private MyBean myBean;

但我真的不喜欢这个解决方案。我想在一些注释中包含我的 JNDI 路径,以便能够执行以下操作:

@EJB(lookup = MyBean.JNDI_NAME)
private MyBean myBean;
4

2 回答 2

8

我们找到了非常好的和简单的解决方案。在 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;
于 2012-10-25T07:19:26.227 回答
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;
于 2012-10-19T20:55:40.537 回答