2012-01-08 20 views
1

こんにちは@All :)私はここで奇妙な問題があります。私はUserBean管理エンティティを@EJB(beanName="user")のクラスに注入したいと思います。私はbeanName属性を使用しない場合、私は次のようなエラーメッセージが出ます:デプロイ時にEJB beanNameが見つかりません

org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name null 

を私は@EJB(beanName="user") UserBean user;ようにそれを使用している場合、私はこれを取得:私が間違って

org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name user 

何をしているのですか?ここで

UserBeanであり、私はそれを注入する方法:

UserBeanの

// removed imports 
@ManagedBean(name="user") 
@Local 
@SessionScoped 
@Entity 
@Table(name="t_user") 
public class UserBean implements Serializable, UserInterface{ 
    // fields (@Columns, etc.) 
    // setters/getters 
} 

UserBeanUser

// more removed imports 
@ManagedBean(name="userUsed") 
@Stateful 
@Local 
public class UserOfUserBean implements Serializable, Userable { 

    private @EJB(beanName="user") UserBean user; 
} 

インタフェースは空であり、@Localとしてマークされています。

+0

私はこれを見ると今私は、過去に自分自身に「あなたは馬鹿です」と言います。 – nyxz

答えて

3

申し訳ありませんが、これは非常に多くのレベルで間違っていますので、どこから始めるのが難しいですか。

開始するには、表示するコードで@Localアノテーションを使用できません。これは、インタフェースをEJBのビジネスインタフェースとしてマークするか、そのようなインタフェースを指すために使用されます。

次に、エンティティUserBeanは、有効範囲と管理対象Beanではないはずです。これらの注釈は、BeanコンテナにBeanのライフサイクルを管理させるためのものですが、エンティティの場合はそれを担当するエンティティマネージャです。

ここでJSFまたはJava EE ManagedBean注釈を使用したかどうかは不明ですが、後者は必要ではなく、最初のものは上記の説明に従って必要ではありません。

また、一般的な規則では、エンティティの名前を単にUserとし、インターフェイスを実装することはできません。

UserOfUserBeanはさらに解読しにくいです。このBeanはビジネスサービスか(JSF)バッキングBeanであるはずですか?それがバッキングビーンの場合、@Stateful注釈は必要ありません。そうでなければ、@ManagedBeanというアノテーションは必要ありません。

あなたの質問の主な原因:@EJB注釈は非EJB Beanを挿入できません。 JPAエンティティ(@Entity)とJSF管理Bean(@javax.faces.bean.ManagedBean)はEJB Beanではありません。

はまた、@EJBbeanName属性が@ManagedBeanname属性に対応していません。 Bean名は、インタフェースが複数のBeanによって実装され、JSF管理Bean名またはJava EE管理Bean名と関係がない場合に、注入を曖昧さをなくすために使用されるEJB内部のものです。(あなたの質問には適用されませんが、CDIの@NamedとJSFのマネージドBean名の間に関係がある)

最後に、エンティティやバッキングBeanは@Localとしてマークされている空のインターフェイスが必要です。

だから、あなたのエンティティのようなものになるはずです。

@Entity 
@Table(name="t_user") 
public class User implements Serializable { 
    // fields (@Columns, etc.) 
    // setters/getters 
} 

そして、あなたは、エンティティにあなたが行った方法を注入することを忘れるべきです。 HTTPセッションで利用できるようにする場合は、手動でログインします(ログイン後など)。それを行う方法についてのより精巧な説明についてはこの回答を参照してください。

@Named(name="userUsed") 
public class UserOfUserBean { 

    @Inject 
    @LoggedIn // see answer from jan groth 
    private User user; 
} 

のみJSF注釈を含む:あなたのUserOfUserBeanを想定しhttps://stackoverflow.com/a/6355064/472792

は、それがその後、CDIと、このようなものになる、バッキングBeanました:

@ManagedBean(name="userUsed") // from javax.faces.bean, not javax.annotation 
public class UserOfUserBean { 

    @ManagedProperty("#{user}") 
    private User user; 

    // Mandatory setter for JSF-native injection 
    public void setUser(User user) { 
     this.user = user; 
    } 
} 

いくつかの追加のリソース:

+0

非常によく、あなたの声援と詳細な答えに感謝します。あなたにもう1つの質問:EJB/JSF/CDIについて読むことができる良い本をいくつか紹介してもらえますか? – nyxz

+1

ようこそ。純粋なEJB理論に役立つ以下の書籍が見つかりました:http://www.amazon.co.uk/dp/0596158025およびhttp://www.amazon.co.uk/dp/1933988347およびJSFの次の記事:http: //www.amazon.co.uk/dp/0137012896とhttp://www.amazon.co.uk/dp/0071625097(最後のものはいくつかの正誤表が必要です)。残念ながら、まだCDIについては何もありませんし、それらの間の交差点についてさえも(CDIについて少しはCayの本が少し扱っています)。おそらくhttp://www.amazon.co.uk/dp/0557078326にはその一部が含まれていますが、私はまだそれを読む時間がありませんので、わかりません。 –

+0

ありがとうございましたArjan Tijms :) – nyxz

関連する問題