Jsf 在超级bean上调用@PostConstruct并扩展bean

Jsf 在超级bean上调用@PostConstruct并扩展bean,jsf,postconstruct,Jsf,Postconstruct,我有一个带有@PostConstruct的BaseBean,还有一个扩展它的bean,我想在它上面调用另一个@PostConstruct。我读过几个地方,其中说这是可能的,但是,似乎扩展类上的@postConstruct被称为第一个(如果第二个被调用的话)。然后我得到一个关于“上下文”的NPE,因为我假设超级bean的后构造已经被调用了 这可以吗?如果是,我做错了什么 基本bean: @ManagedBean @RequestScoped public class BaseBean { @Man

我有一个带有@PostConstruct的BaseBean,还有一个扩展它的bean,我想在它上面调用另一个@PostConstruct。我读过几个地方,其中说这是可能的,但是,似乎扩展类上的@postConstruct被称为第一个(如果第二个被调用的话)。然后我得到一个关于“上下文”的NPE,因为我假设超级bean的后构造已经被调用了

这可以吗?如果是,我做错了什么

基本bean:

@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);
}
谢谢,
Yotam.

在构建托管bean时,根本不调用支持bean的超类的
@PostConstruct
。仅当通过在您的示例中使用EL中的
{baseBean}
来构造该超类的完全独立的托管bean实例时,才会调用它。实际上,您最终得到了两个完全独立的实例
{baseBean}
{smartBoxSearchBean}
,其中类的own
@PostConstruct
方法是在托管bean类本身上独立调用的

这个设计有点奇怪。支持bean的超类通常根本不能用作托管bean

我建议将您的方法修改如下:

public abstract class BaseBean {

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

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

}

或者,如果您根本不需要
ContextBean
用于其他目的,也可以这样做

public abstract class BaseBean {

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

    public Context getContext() {
        return context;
    }

}
请注意,
@ManagedProperty
以这种方式在超类中声明时工作正常


更新:根据功能需求,您还可以解耦bean,只需在
{smartBoxSearchBean}
中插入
{baseBean}

@ManagedBean
@RequestScoped
public class BaseBean {

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

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

}


感谢巴卢斯的快速回答。您的解决方案将起作用,除了一个问题-在BaseBean的后构造中,我还初始化其他成员,扩展bean使用…@YotamSeon我有一个非常类似的问题。你是否得出结论,接受的建议是你能找到的唯一解决办法?
@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);
    }

}