2012-06-26 37 views
9

我有一個帶有@PostConstruct的BaseBean和一個擴展它的bean,我想調用另一個@PostConstruct。我已經閱讀了幾個地方說它是可能的,但是,看起來擴展類上的@postConstruct首先被調用(如果第二個被調用)。然後我在「context」上獲得NPE,因爲我假設超級bean的PostConstruct已經被調用。在超級bean上調用@PostConstruct並擴展bean

這是可行的嗎?如果是這樣我做錯了什麼?

基地豆:

@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); 
} 

感謝, Yotam。

+0

@YotamSeon我有一個非常類似的問題[這裏](http://stackoverflow.com/q/29787068/330457)。你是否認爲接受的建議是唯一的解決方案? –

回答

10

支持Bean的超類的@PostConstruct在構造託管bean時根本不被調用。只有當一個完全獨立的該超類的託管bean實例已經被例如在你的案例中使用EL中的#{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); 
    } 

} 

或者,也許這一點,如果你沒有在所有

public abstract class BaseBean { 

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

    public Context getContext() { 
     return context; 
    } 

} 
需要 ContextBean用於其他目的

請注意@ManagedProperty在超類中聲明時工作正常辦法。


更新:根據功能需求,還可以斷開豆和剛注入#{baseBean}{smartBoxSearchBean}

​​

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean { 

    @ManagedProperty("#{baseBean}") 
    private BaseBean baseBean; 

    @PostConstruct 
    public void setUp() { 
     jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class); 
    } 

} 
+1

感謝BalusC爲超級快速回答。您的解決方案將工作,除了一個問題 - 在BaseBean的PostConstruct中,我還初始化其他成員,即擴展bean使用... –

+0

查看答案更新。 – BalusC

+0

再次感謝,實施! –

相關問題