9

@PostConstructを持つBaseBeanと、それを拡張するBeanがあり、その上で別の@PostConstructを呼び出したいと思います。可能だと言った場所をいくつか読んだことがありますが、拡張クラスの@postConstructが最初に呼び出されたようです(2番目が呼び出された場合)。次に、スーパーBeanのPostConstructがすでに呼び出されていると想定しているため、「コンテキスト」でNPEを取得します。

これは実行可能ですか?もしそうなら、私は何を間違っていますか?

ベースビーン:

@ManagedBean
@RequestScoped
public class BaseBean {
@ManagedProperty(value = "#{contextBean}")
  private ContextBean contextBean;
  Context context;
@PostConstruct
public void setupContext() {
    context = getContextBean().getContext();
}

Beanの拡張:

@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {
@PostConstruct
public void setUp() {
    jsonHelper = context.get(SmartBoxJsonHelper.class);
}

ありがとう、ヨタム。

4

1 に答える 1

10

管理対象Beanの構築時には、バッキングBeanの@PostConstructスーパークラスのはまったく呼び出されません。これは、そのスーパークラスの完全に別個#{baseBean}のマネージドBeanインスタンスが、たとえばELで使用することによって構築された場合にのみ呼び出されます。事実上、2つの完全に別個のインスタンスが作成さ#{baseBean}れ、クラス自体#{smartBoxSearchBean}@PostConstructメソッドがマネージドBeanクラス自体で独立して呼び出されます。

このデザインは少し奇妙です。バッキングBeanのスーパークラスは、通常、マネージドBeanとしてはまったく使用されません。

次のようにアプローチを修正することをお勧めします。

public abstract class BaseBean {

    @ManagedProperty("#{contextBean}")
    private ContextBean contextBean;

    public Context getContext() {
        return contextBean.getContext();
    }

}

@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {

    @PostConstruct
    public void setUp() {
        jsonHelper = getContext().get(SmartBoxJsonHelper.class);
    }

}

ContextBeanまたは、他の目的がまったく必要ない場合は、これかもしれません

public abstract class BaseBean {

    @ManagedProperty("#{contextBean.context}")
    private Context context;

    public Context getContext() {
        return context;
    }

}

@ManagedPropertyこのようにスーパークラスで宣言すると、問題なく機能することに注意してください。


更新:機能要件に応じて、Beanを切り離して、に注入することもでき#{baseBean}ます{smartBoxSearchBean}

@ManagedBean
@RequestScoped
public class BaseBean {

    @ManagedProperty("#{contextBean}")
    private ContextBean contextBean;
    private Context context;

    @PostConstruct
    public void init() {
        context = contextBean.getContext();
    }

}

@ManagedBean
@RequestScoped
public class SmartBoxSearchBean {

    @ManagedProperty("#{baseBean}")
    private BaseBean baseBean; 

    @PostConstruct
    public void setUp() {
        jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class);
    }

}
于 2012-06-26T19:15:52.480 に答える