2011-07-08 33 views
5

私は、Beanを持っている。このように定義された@ManagedBean注釈、と:私は私の中でFooBeanを参照しようとするとJSF 2:@ManagedBeanを継承することは可能ですか?


public class FooBean extends Bean { 
    // properties, methods here ... 
} 


:今


@ManagedBean 
@SessionScoped 
public class Bean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

} 

、私は次のように定義された別のBeanを持っていますJSFページで次のエラーが発生しました:
Target Unreachable, identifier 'fooBean' resolved to null

e FooBeanをマネージドBeanとして使用しますか?

答えて

-1

の内側に、私はこの質問hereへの回答を掲載しているようにしてください。)

4

BaseBeanは管理対象Beanにする必要がありますか? BaseBeanという名前なので、このBeanは他のすべてのマネージドBean間の共通性を保持していると仮定します。その場合は、@ManagedBeanアノテーションを含むべきではありません。この

public abstract BaseBean{ 
    //... 
} 

は、その後、あなたの管理Bean

@ManagedBean 
@RequestScoped 
public class FooBean extends BaseBean{ 
    //... 
} 
+0

これを行うことで、すべてのBeanに@ManagedBeanを置く必要があります。これは避けたいものです! – Stephan

+2

@Stephan:すべてのマネージドBeanに注釈を付けるのはなぜですか?あなたの 'BaseBean'の中に何を入れているのか分かりませんが、名前を付けた方法から、すべてのマネージドBean間の共通性を設定する必要があります。@ManagedBeanに注釈を付けるべきではありません。あなたの 'モデル'。 'BaseBean'を' SessionScoped'にすると、 'BaseBean'から継承するすべてのBeanは、SessionScopedになります。あなたはセッションであまりにも多くのものを保持したくありません。 RequestScopedを持ち、 'BaseBean'を継承したマネージドBeanを作成する場合はどうでしょうか? –

+0

もっと明確にする:@ManagedBeanを継承することは可能ですか? – Stephan

7

アレックスが作るしようとしている点は、あなたがクラスを混乱しているということですインスタンスと共に。これは古典的な(間違った言葉遣いの)OOPミスです。

@ManagedBeanアノテーションは、クラスごとに機能しません。そのようなクラスのインスタンスで動作し、管理されるインスタンスを定義します。

あなたのBeanは、次のように定義されている場合:

@ManagedBean 
@SessionScoped 
public class MyBean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
} 

その後、それはあなたがセッションスコープインスタンスを持っていることを意味し、MyBeanとと呼ばれる(あるいはあなたはそれを名前を付けたいものは何でも)。

したがって、MyBean クラスのサブクラスであるすべてのクラスは、デフォルトでは管理されません。さらに、JSFはサブクラスの使用場所をどのように認識しますか?もしそうなら、それらのインスタンスにはどのような名前を付けていますか? (あなたがそれらにいくつかの名前を与える必要があるので、それ以外の場合は、それらをどのように管理するJSFのでしょうか?)

をそれでは、あなたは他のクラスとしましょう:

Class MyOtherClass { 
    private MyBean myBeanObject; // myBeanObject isn't managed. 
} 

@PostConstructおよび他のすべての注釈に何が起こるかを使いました?何もない。 MyBeanのインスタンスを作成した場合、JavaServerFacesではなく、誰が管理するのですか?したがって、実際にはマネージドBeanではなく、使用する共通オブジェクトです。あなたがこれを行うとき

は、しかし、物事は完全に変更します。

@ManagedBean 
@SessionScoped 
Class MyOtherClassBean { 
    @ManagedProperty("#{myBean}") 
    private MyBean myBeanObject; 

    public void setMyBeanObject(...) { ... } 
    public MyBeanClass getMyBeanObject() { ... } 
} 

その後、再び、どのような管理されていることは、クラスではなく、クラスのインスタンス。 ManagedBeanを持つと、そのBeanのインスタンスが1つだけ(つまり、スコープごとに)存在することになります。

+0

ご説明いただきありがとうございます。しかし、なぜhttp://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.htmlに@Inherited注釈が付いていますか? – Stephan

関連する問題