2016-07-04 13 views
0

h:inputTextフィールドの隣にメッセージを表示したいだけですが、代わりにグローバルメッセージのフィールドに表示されます。JSF2 h:メッセージが特定のフィールドに表示されない

メッセージフィールドはバインディングタグによってinputTextにバインドされますが、バッキングBeanのgetClientId()を使用してメッセージフィールドを呼び出すと、返されたIDは間違っているようです。私はこれによってメッセージがグローバルなフィールドに表示されると思います。

これは、下のリンクされた画像で見ることができます。

Display of the website

マイページ:

<a4j:outputPanel id="editPanel"> 
     <a4j:queue requestDelay="300" ignoreDupResponses="true" /> 
     <table> 
      <tr> 
       <td>Kostenstelle</td> 
       <td><h:inputText id="kst" inputType="text" placeholder="" 
         value="#{kostenstellenBean.kst}" label="Kostenstelle" 
         maxlength="5" binding="#{kostenstellenBean.kstInput}"> 
         <a4j:ajax event="keyup" render="buttonPanel kstMessage" /> 
        </h:inputText></td> 
       <td><h:message id="kstMessage" for="kst" /></td> 
      </tr> 
      <tr> 
       <td>Bezeichnung</td> 
       <td><h:inputText id="bezeichnung" inputType="text" 
         placeholder="" value="#{kostenstellenBean.bezeichnung}" 
         label="Bezeichnung" maxlength="20" 
         binding="#{kostenstellenBean.bezeichnungInput}"> 
         <a4j:ajax event="keyup" render="buttonPanel bezeichnungMessage" /> 
        </h:inputText></td> 
       <td><h:message id="bezeichnungMessage" for="bezeichnung" /></td> 
      </tr> 
      <tr> 
       <td>BA</td> 
       <td><h:inputText id="ba" inputType="text" placeholder="" 
         value="#{kostenstellenBean.ba}" label="BA" maxlength="3" 
         binding="#{kostenstellenBean.baInput}"> 
         <a4j:ajax event="keyup" render="buttonPanel baMessage" /> 
        </h:inputText></td> 
       <td><h:message id="baMessage" for="ba" /></td> 
      </tr> 
      <tr> 
       <td>BK</td> 
       <td><h:inputText id="bk" inputType="text" placeholder="" 
         value="#{kostenstellenBean.bk}" label="BK" maxlength="3" 
         binding="#{kostenstellenBean.bkInput}"> 
         <a4j:ajax event="keyup" render="buttonPanel bkMessage" /> 
        </h:inputText></td> 
       <td><h:message id="bkMessage" for="bk" /></td> 
      </tr> 
      <tr> 
       <td>BL</td> 
       <td><h:inputText id="bl" inputType="text" placeholder="" 
         value="#{kostenstellenBean.bl}" label="BL" maxlength="3" 
         binding="#{kostenstellenBean.blInput}"> 
         <a4j:ajax event="keyup" render="buttonPanel blMessage" /> 
        </h:inputText></td> 
       <td><h:message id="blMessage" for="bl" /></td> 
      </tr> 
      <!-- 
      <h:inputHidden id="index" inputType="text" placeholder="" 
       value="#{kostenstellenBean.index}" label="Index" /> 
      <h:inputHidden id="row" inputType="boolean" placeholder="" 
       value="#{kostenstellenBean.rowSelected}" label="Index" /> 
       --> 
     </table> 
     <rich:panel id="buttonPanel"> 
      <bwf:commandButton id="save" value="Speichern" 
       disabled="#{!kostenstellenBean.validateData()}"> 
       <rich:componentControl target="confirmation_save" operation="show" /> 
      </bwf:commandButton> 
      <bwf:commandButton id="edit" value="Ändern" 
       disabled="#{!kostenstellenBean.rowSelected or !kostenstellenBean.validData}"> 
       <rich:componentControl target="confirmation_edit" operation="show" /> 
      </bwf:commandButton> 
      <bwf:commandButton id="delete" value="Löschen" 
       disabled="#{!kostenstellenBean.rowSelected}"> 
       <rich:componentControl target="confirmation_delete" 
        operation="show" /> 
      </bwf:commandButton> 
      <h:messages /> 
     </rich:panel> 
    </a4j:outputPanel> 

とバッキングBean内の私の検証方法:

public boolean validateData() { 
    boolean valid = true; 
    String message; 
    FacesContext context = FacesContext.getCurrentInstance(); 
    if (kst == 0) { 
     message = "Kostenstelle ungültig! "; 
     context.addMessage(kstInput.getClientId(), new FacesMessage(message 
       + kstInput.getClientId())); 
     valid = false; 
    } 
    if (bezeichnung == null || bezeichnung.isEmpty()) { 
     message = "Bezeichnung muss vorhanden sein!"; 
     context.addMessage(bezeichnungInput.getClientId(), 
       new FacesMessage(message)); 
     valid = false; 
    } 
    if (ba + bk + bl != 100) { 
     message = "Die Summe aller Verteilungsschlüssel muss 100 ergeben! "; 
     context.addMessage(baInput.getClientId(), new FacesMessage(message)); 
     valid = false; 
    } 
    validData = valid; 
    return valid; 
} 

これらすべての入力フィールドは、その入力に応じて、コマンドボタンの可用性を変更します。有効でない場合は、コマンドボタンを無効にする必要があります。これまでのところ動作します。

問題は、バッキングBeanで呼び出されたメッセージは、バインディングでアドレス指定する入力フィールドの横に表示されず、getClientId()ではなく、コマンドボタンのグローバルメッセージのフィールドに表示されます(このフィールドは、メッセージは適切に表示されます)。

誰かが私が作ったミスを指摘したり、私のロジックの欠陥を教えてくれたらと思っています。

+0

facesメッセージのclientIDは何ですか?彼らは本当に完全な正しいクライアントIDですか? – Kukeltje

+0

これを次のようなメッセージに追加すると:新しいFacesMessage(メッセージ+ bezeichnungInput.getClientId()) a4j:outputPanelを囲む唯一のタグでも、kst、form:bezeichnungまたはform:baに変換されますui:compositionとhtml:bodyです。 – Marco

答えて

0

別のアプローチを試して問題を解決しました。

ここでは、最初の2つの入力フィールドにrequired属性を使用していますが、これは単に空であってはなりません。その結果、指定されたメッセージフィールドにエラーメッセージが表示されます。

その他の3つの入力フィールドの場合、バッキングBeanのメソッドは、その合計が100に等しいかどうかをチェックし、グローバルメッセージを表示しない場合のみチェックします。

関連する問題