2012-01-13 42 views
2

我試着去使用動態validationGroupsJSF 2.1 validateBean preRenderView事件

<h:inputText id="id" value="#{bean.char}" maxlength="8" alt="#{bean.displayName}"> 
     <f:validateBean 
       validationGroups="#{bean.validationGroup}" /> 
</h:inputText> 

然而,#{} bean.validationGroup前

<f:event type="preRenderView" listener="#{bean.initView}" /> 

總是被調用之前一直叫這是MyFaces中的錯誤?我需要在prerenderview之後調用#{bean.validationGroup},因爲preRender會從db加載數據,並且validationGroups會有所不同。我用richfaces 4.1使用Myfaces 2.1.5。

回答

1

這確實是指定的行爲。在查看構建時運行<f:xxx>標籤。如果你想在構建視圖之前初始化屬性,那麼你需要在bean的(後)構造函數方法中完成這項工作。預渲染視圖事件在渲染視圖之前運行,但在視圖建立之後很久。

一起取下<f:event>並改爲製作initView一個@PostConstruct方法。

@PostConstruct 
public void initView() { 
    // ... 
} 

將bean的建設和完成所有的依賴注射像@ManagedProperty@Inject@EJB等後直接運行。

+0

好的謝謝。這讓我回到關於PostConstruct vs preRenderView的問題。我有調用PostConstuct之前未設置的f:viewParam。所以我掃描了問題,解決方案是使用preRenderView。現在即時通過圈子 – user1147953 2012-01-13 16:09:32

+0

您可以使用'@ManagedProperty(「#{param.foo}」)或'externalContext.getRequestParameterMap()。get(「foo」)'而不是''。 – BalusC 2012-01-13 16:11:24

0
@ManagedBean 
@XScoped --sessionScope,viewScope 
Public class Bean{ 
public void initView(){ 
    if (!FacesContext.getCurrentInstance().isPostback(){ 
    //put initView codes here 
    } 
    } 

} 
+0

這究竟是如何解決具體問題的?或者你是否完全瞭解具體問題? – BalusC 2012-01-15 18:52:25

相關問題