9

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

这是可行的吗?如果是这样,我做错了什么?

基豆:

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

扩展豆:

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

谢谢,尤塔姆。

4

1 回答 1

10

@PostConstruct构建托管 bean 时,根本不调用支持 bean 的超类。只有在您的情况下,例如通过在 EL 中使用来构造该超类的完全独立的托管 bean 实例时,才会调用它。#{baseBean}您实际上最终得到了两个完全独立的实例#{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 回答