2015-09-05 81 views
0

在經歷了一段絕望的嘗試和錯誤之後,我來找你尋求幫助,因爲現在我甚至不確定自己是否做得不對。在ui中沒有觸發JSF 2.2自定義驗證器:重複

我的代碼如下所示,顯示只讀輸入文本框中用戶配置文件的一些字段。數據來自一個bean,作爲「字段」對象的ArrayList,其屬性在ui:param指令中描述。 用戶可以點擊框旁邊的解鎖/鎖定按鈕開始/結束編輯她的數據。 當用戶在編輯後按下Enter或點擊鎖定按鈕時,我想觸發輸入驗證。

但無論我嘗試過,編輯並按下輸入或單擊按鈕後,更改的值不會被寫回,並且我的自定義驗證程序不會被觸發。不知何故,似乎單擊按鈕後,呈現的輸入框不會綁定到該字段?然而,驗證工作(和所有屬性獲得通過它)如果是始終呈現一個輸入文本使用的 - 我不明白:)

請看看它。如果我沒有足夠好地解釋我的意圖,或者如果您需要更多代碼,請告訴我。

編輯:支持bean的註釋:

@ManagedBean(name = "beanProfile") 
@RequestScoped 

了JSF代碼:

<ui:composition> 
    <ui:param name="i18n" value="#{field.i18n}" /> 
    <ui:param name="val" value="#{field.value}" /> 
    <ui:param name="req" value="#{field.required}" /> 
    <ui:param name="min" value="#{field.min}" /> 
    <ui:param name="max" value="#{field.max}" /> 
    <ui:param name="validationType" value="#{field.validationType}" /> 
    <ui:param name="useHidden" value="#{field.hidden}" /> 
    <ui:param name="locked" value="#{field.locked}" /> 
    <ui:param name="fullName" value="#{beanProfile.name}" /> 

    <h:form id="profileFrm"> 
     <h:outputText value="#{msg.role_profile}&nbsp;" styleClass="headingOutputText" /> 
     <h:outputText value="#{fullName}" styleClass="headerTitle" /> 
     <p />   
     <h:panelGroup> 
      <ui:repeat var="field" value="#{beanProfile.userFields}"> 
       <h:panelGrid columns="2"> 
        <h:outputText value="#{msg[i18n]}" styleClass="headerTitle" /> 
        <h:message showDetail="true" for="visInput" styleClass="warn" 
         rendered="#{!useHidden}" /> 
        <h:message showDetail="true" for="invisInput" styleClass="warn" 
         rendered="#{useHidden}" /> 
       </h:panelGrid> 
       <h:panelGrid columns="2" columnClasses="nameColumn"> 
        <h:inputText id="visInput" required="true" value="#{val}" 
         rendered="#{!useHidden}" readonly="#{locked}" > 
         <f:validator validatorId="customValidator" /> 
         <f:attribute name="requiredField" value="#{req}" /> 
         <f:attribute name="minLen" value="#{min}" /> 
         <f:attribute name="maxLen" value="#{max}" /> 
         <f:attribute name="type" value="#{validationType}" /> 
        </h:inputText> 
        <h:inputSecret id="invisInput" required="true" value="#{val}" 
         rendered="#{useHidden}" readonly="#{locked}"> 
         <f:validator validatorId="customValidator" /> 
         <f:attribute name="requiredField" value="#{req}" /> 
         <f:attribute name="minLen" value="#{min}" /> 
         <f:attribute name="maxLen" value="#{max}" /> 
         <f:attribute name="type" value="#{validationType}" /> 
        </h:inputSecret> 
        <h:commandLink id="lock" action="#{beanProfile.lock(field)}" 
         rendered="#{!locked}" title="#{msg.profile_lock}"> 
         <h:graphicImage height="16" width="16" 
          name="images/padlock_unlocked.svg" alt="#{msg.profile_lock}" /> 
        </h:commandLink> 
        <h:commandLink id="unlock" action="#{beanProfile.unlock(field)}" 
         rendered="#{locked}" title="#{msg.profile_unlock}"> 
         <h:graphicImage height="16" width="16" 
          name="images/padlock_locked.svg" alt="#{msg.profile_unlock}" /> 
        </h:commandLink> 
       </h:panelGrid> 
      </ui:repeat> 
     </h:panelGroup> 
     <p /> 
     <h:commandButton id="submitProfileBtn" value="#{msg.cmd_submit}" 
      styleClass="button" includeViewParams="true" 
      action="#{beanProfile.submitProfile()}" /> 
    </h:form> 
</ui:composition> 
+0

Colud你顯示應用於beanProfile' backing bean的註釋嗎? – lametaweb

+0

更改爲ViewScoped範圍,包javax.faces.view – lametaweb

+0

我沒有和得到這個錯誤:CDI @ViewScoped管理器不可 – Alfred

回答

1

問題的根源在於您使用的RequestScoped範圍用於包含模型的支持bean,因此,當您想要執行回發請求以執行backing bean方法時,綁定只會消失(而不是服務器內存)並且JSF生命週期不按預期執行。解決方案是使用更長的作用域作爲ViewScoped作用域。理想情況下,您應該使用兼容CDI的viewScoped範圍,因此您必須使用JSF 2.2.x版本。

0

謝謝lametaweb,你使我在正確的方向。

暫時無法使用@ViewScoped註釋我找到了鏈接

how-to-install-cdi-in-tomcat

,隨後BalusC的方向爲在Tomcat中使用CDI。然後我不得不讓所有的java類實現Serializable接口。

現在我可以使用@ViewScoped註釋並驗證器被觸發。

+0

您好,我很高興你解決你的問題。我已經爲最初的問題寫了一個答案,請接受它。要將答案標記爲已接受,請單擊答案旁邊的複選標記以將其從空心切換爲綠色。 – lametaweb