管理対象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);
}
}