2011-10-21 20 views
12

私はSpring MVC 3.0で新しいJava Webアプリケーションを作成しています。できるだけ多くの標準Java EE 6のものを使いたいと思っています。 (私はGlassfish 3.1.1を使用しています)実際のドライバは、JSFではなくMVC Webフレームワークを使用したいと考えています。Spring MVC 3.0と@EJBアノテーションを使用するwtHout mappedName?

私はSpringコントローラに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 
} 

しかし、私は、コントローラ内の@EJB注釈の「にmappedName」を必要に不満だ:

これは、JNDI経由でEJBを見つけることによって、働いていました。

これを行うより良い方法はありますか?

しかし、良いニュースは、EJBとSpring Beanで同じ@Injectアノテーションを使用でき、唯一の違いは、どのフレームワークがオブジェクトを作成してインジェクションを行っているかです。

答えて

-1

春のために、あなたはJndiObjectFactoryBeanにJNDIルックアップをラップすることができます:次に

<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

それはちょうど悪化IMOを感じるXMLに問題をプッシュします。 – wrschneider

+0

@ wrschneider99なぜですか?あなたは* mappedName *パラメータを取り除きたいと思っています。それは質問ではありませんでしたか?それ以外の場合は、コード内でJNDIルックアップを行うことができます。これは完全に移植可能ですが、醜いでしょう。 – MaDa

+0

明示的なmappedNameが不要なように、JNDIルックアップが慣例によって起こりうる何らかの方法があることを期待していました。あるいは、必要に応じて、EJBアノテーションのSpringの解釈に固有のデフォルトを利用するために、ステートレスアノテーションに設定をプッシュすることは気にしません。 – wrschneider

2

あなたが使用している場合

mappedName="java:module/Service" 

代わりの

mappedName="java:global/springtest/Service" 

あなたはappnameのを心配する必要はありません。 これにより、コードは移植性が向上します。私はあなたの問題のいくつかを解決するだろうと思う。

関連する問題