I have a BaseBean with a @PostConstruct, and a bean extending it on which i would like to call another @PostConstruct. I have read several places where it said it was possible, however, it seems the @postConstruct on the extending class is called first (if the second is called at all). I then get a NPE on “context” because I’m assuming the super bean’s PostConstruct has already been called.
Is this do-able? If so what am I doing wrong?
Base bean:
@ManagedBean
@RequestScoped
public class BaseBean {
@ManagedProperty(value = "#{contextBean}")
private ContextBean contextBean;
Context context;
@PostConstruct
public void setupContext() {
context = getContextBean().getContext();
}
Extending bean:
@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {
@PostConstruct
public void setUp() {
jsonHelper = context.get(SmartBoxJsonHelper.class);
}
Thanks,
Yotam.
The
@PostConstructof the superclass of a backing bean is not called at all when the managed bean is constructed. It’s only called when a completely separate managed bean instance of that superclass is been constructed by e.g. using#{baseBean}in EL in your case. You effectively end up with two entirely separate instances#{baseBean}and#{smartBoxSearchBean}wherein the class’ own@PostConstructmethod is invoked independently on the managed bean class itself.This design is somewhat strange. A superclass of a backing bean is normally not to be used as a managed bean at all.
I suggest to revise your approach as follows:
and
Or maybe this, if you don’t need
ContextBeanfor other purposes at allNote that
@ManagedPropertyworks just fine when declared in a superclass this way.Update: depending on the functional requirements, you can also decouple the beans and just inject the
#{baseBean}in the{smartBoxSearchBean}.and