h:inputTextフィールドの隣にメッセージを表示したいだけですが、代わりにグローバルメッセージのフィールドに表示されます。JSF2 h:メッセージが特定のフィールドに表示されない
メッセージフィールドはバインディングタグによってinputTextにバインドされますが、バッキングBeanのgetClientId()を使用してメッセージフィールドを呼び出すと、返されたIDは間違っているようです。私はこれによってメッセージがグローバルなフィールドに表示されると思います。
これは、下のリンクされた画像で見ることができます。
マイページ:
<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()
ではなく、コマンドボタンのグローバルメッセージのフィールドに表示されます(このフィールドは、メッセージは適切に表示されます)。
誰かが私が作ったミスを指摘したり、私のロジックの欠陥を教えてくれたらと思っています。
facesメッセージのclientIDは何ですか?彼らは本当に完全な正しいクライアントIDですか? – Kukeltje
これを次のようなメッセージに追加すると:新しいFacesMessage(メッセージ+ bezeichnungInput.getClientId()) a4j:outputPanelを囲む唯一のタグでも、kst、form:bezeichnungまたはform:baに変換されますui:compositionとhtml:bodyです。 – Marco