2011-06-08 7 views
9

私はJava EEを全く新しくしましたが(Java自体ではありません)、実際のUIフレームワークとしてJPAプロバイダとJSFとしてHibernateで非常に単純な「エンタープライズアプリケーション」を構築しようとしています。この目的のために、私はGlassFish 3.1でNetBeans 7を使用しています。EJBステートレスセッションBeanはどのようにしてWebモジュールに正しく挿入されるべきですか?

{}のApplicationName -ejb:私は、データベースからエンティティクラスと、これらのエンティティのためのローカルsesssion豆を生成するために達成してきました

Beans.xmlがインストールされています。

@Stateless 
public class QuestFacade extends AbstractFacade<Quest> implements QuestFacadeLocal { 
    // some methods here as well as EntityManager injection ... 
} 

{}のApplicationName -war:

私は、JSFページのバッキングBeanとして簡単なPOJOを作成しました。私は[email protected][email protected]と注釈をつけました。このバッキングBeanは、実際のページにアクセスするときに注入されるだけでなく、JSFページからアクセスできるようになりました。 Beans.xmlも同様です。これが展開され、ページがアクセスした

@Named 
@SessionScoped 
public class QuestBean implements Serializable { 

    @EJB 
    protected QuestFacade questFacade; 

    // several methods delegating lookups to the questFacade ... 
} 

、私はQuestFacadeは、JNDIでルックアップすることができないというのGlassFishからエラーを取得して、しかし、です。

スタックトレースは非常に長いですが、最初の原因は十分に考えられます

Caused by: javax.naming.NamingException: Lookup failed for 'model.session.QuestFacade#model.session.QuestFacade' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: model.session.QuestFacade#model.session.QuestFacade not found] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:173) 
    ... 74 more 
Caused by: javax.naming.NameNotFoundException: model.session.QuestFacade#model.session.QuestFacade not found 
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215) 
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 
    at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:119) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:505) 
    ... 78 more 

私は、同じアプリケーション内の異なるモジュールからのEJBを注入するのGlassFishを説得てることを理解しています。代わりに@Remoteインターフェイスを使用する必要がありますか?また、@Stateless@EJB注釈の名前を明示的に指定しようとしましたが、成功しませんでした。

私は何か根本的に間違っていると信じていますが、何が見つかりませんか?

ご意見やご感想をお寄せください。

答えて

11

私はfundamentaly何か間違ったことをやっていると信じているが、私は何を見つけることができません。何が間違ってやっていることは、あなたがビジネスインタフェース(@Localまたは@Remoteのいずれか)を実装する場合は、あなたがそのインターフェイスのタイプを持つものとしてではなく、実際のBeanの注入が行われる変数を宣言しなければならないということです

クラス。だからあなたの場合

@Named 
@SessionScoped 
public class QuestBean implements Serializable { 

    @EJB 
    protected QuestFacadeLocal questFacade; 

    // several methods delegating lookups to the questFacade ... 
} 

ローカル(インJVM)の通信をやっているときしかし、ビジネスインタフェースは、EJBで必要とされていません。発見したように、EJBに対してビジネスインタフェースをまったく指定しないと、Beanクラス自体を注入できます。これは、いわゆるno-interface viewを自動的に取得するためです。

必要に応じて、ローカルビューとno-interfaceビューの両方を必要とすることを任意に宣言できます。このようにして、Bean型自体が宣言されているか、ビジネスインタフェースであるかにかかわらず、Beanクラスを場所に挿入できます。このためには、@LocalBeanを使用します。

@Stateless 
@LocalBean 
public class QuestFacade extends AbstractFacade<Quest> implements QuestFacadeLocal { 
    // some methods here as well as EntityManager injection ... 
} 

注入は、このようになりました2通りの方法で発生する可能性があります:実際に

@Named 
@SessionScoped 
public class QuestBean implements Serializable { 

    @EJB 
    protected QuestFacadeLocal questFacade; // possible because of local view 
    @EJB 
    protected QuestFacade questFacadeN; // possible because of no-interface view 

    // several methods delegating lookups to the questFacade ... 
} 

を私はしかし、同時に利用できる両方の方法を持つための多くの使用が見つかりませんでしたが、多分これはあなたの理解に追加。

+0

私は自分自身を助けることができましたが、私が私の答えで指摘したように、私はあなたの答えがより良いと思っています。ありがとう! – merxbj

+0

うわー。ちょうど正確! – kuhajeyan

0

明らかに問題は私が@LocalセッションBeanを生成したことでした。 this tutorialでは、@Localまたは@Remoteインターフェイスを指定する必要はなくなりました(?)。私はまだ問題を完全に理解していません。

私は

:-)この回答が誰かにいくつかの時間を節約するpotentialyことを願ってい

Jarda

関連する問題