2012-10-18 82 views
7

我試圖注入EJB到Spring(3.1.2)服務(無論是在不同的WAR) 兩者都是非常簡單的(方法去除,以簡化的例子):注入EJB 3到Spring Bean的

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路徑能夠做到e.g:

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

謝謝託梅克:)這「以某種方式」解決了我的問題。我正在瞄準一些更簡單的解決方案,但如果我不能用一個註釋來解決它,我會盡力。我認爲在Spring中注入EJB真的很容易(畢竟它是標準的))。 –

+0

由於沒有人回答,所以將我的評論轉到了答案。 –

回答

8

我們發現相當不錯的,簡單的解決方案。 到Spring配置文件中的一個必須放:

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> 
    <property name="alwaysUseJndiLookup" value="true" /> 
</bean> 

而且,使彈簧搜索在JNDI與@Resource註解。 所以,現在你可以這樣做:

@Resource(mappedName = MyBean.JNDI_NAME) 
private MyBean myBean; 
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; 
+0

我從來沒有使用配置對象,但我認爲它不會工作。原因是我們使用的是Spring Portal MVC,它需要具有特定名稱的spring xml文件。我發現只有如何從@Configuration對象引用XML文件 - 不反對,所以我認爲這種配置不會wokr。 –

+0

@MichałMargiel:自從發現'@ Configuration'就像任何其他'@ Service'或'@ Repository'一樣工作。但沒關係,你的解決方案似乎更簡單,更清潔,+1。 –

+0

感謝您的信息。出於好奇,我會檢查它。 –