2011-10-21 39 views
12

我正在用Spring MVC 3.0創建一個新的Java webapp,並且想盡可能多地使用標準Java EE 6的東西。 (我在Glassfish 3.1.1上)。真正的驅動程序想要使用MVC Web框架而不是JSF。使用Spring MVC 3.0和@EJB註釋而沒有mappedName?

所以我正在尋找將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 
} 

但我不滿意的需要「mappedName」在控制器中的@EJB批註。

有沒有更好的方法來做到這一點?

好消息是,我可以在EJB和Spring bean中使用相同的@Inject註釋,唯一的區別是哪個框架正在創建對象並執行注入。

回答

-1

春天,你可以換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; 
+0

這只是將問題推到XML,這感覺更糟的國際海事組織。 – wrschneider

+0

@ wrschneider99爲什麼?你想擺脫* mappedName *參數,所以你明白了。這不是問題嗎?否則,你可以在代碼中執行JNDI查找,這將是完全可移植的,但很難看。 – MaDa

+0

我希望有某種方式可以按照約定來發生JNDI查找,這樣一個顯式的mappedName是不必要的。或者,如果有必要,我不介意將配置推送到無狀態註釋,以利用Spring對EJB註釋解釋所固有的任何默認值。 – wrschneider

2

如果使用

mappedName="java:module/Service" 

代替

mappedName="java:global/springtest/Service" 

你不必擔心程序的名字。 這使得代碼更加便攜。我想這將解決您的一些問題