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