アレックスが作るしようとしている点は、あなたがクラスを混乱しているということですインスタンスと共に。これは古典的な(間違った言葉遣いの)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つだけ(つまり、スコープごとに)存在することになります。
これを行うことで、すべてのBeanに@ManagedBeanを置く必要があります。これは避けたいものです! – Stephan
@Stephan:すべてのマネージドBeanに注釈を付けるのはなぜですか?あなたの 'BaseBean'の中に何を入れているのか分かりませんが、名前を付けた方法から、すべてのマネージドBean間の共通性を設定する必要があります。@ManagedBeanに注釈を付けるべきではありません。あなたの 'モデル'。 'BaseBean'を' SessionScoped'にすると、 'BaseBean'から継承するすべてのBeanは、SessionScopedになります。あなたはセッションであまりにも多くのものを保持したくありません。 RequestScopedを持ち、 'BaseBean'を継承したマネージドBeanを作成する場合はどうでしょうか? –
もっと明確にする:@ManagedBeanを継承することは可能ですか? – Stephan