フォームの検証が他のフォーム要素 (パスワード入力テキストボックス自体ではない) で失敗したときに、パスワードがラベルとして表示されるという非常に奇妙なエラーがあります。ビューのコードは次のとおりです。
<s:if test="%{username == null}">
<form method="post" enctype="multipart/form-data"
action="manageUser_create.action">
</s:if>
<s:else>
<form method="post" enctype="multipart/form-data"
action="manageUser_update.action">
</s:else>
<div>
<s:textfield name="firstName" key="First Name" cssClass="text-input" />
<br class="clear" />
<s:textfield name="lastName" key="Last Name" cssClass="text-input" />
<br class="clear" />
<s:file name="practiceLogo" id="practiceLogo" key="Upload Logo" cssClass="text-input" />
<br class="clear" />
<s:if test="%{username == null}">
<s:textfield name="username" id="username" key="Username" cssClass="text-input" />
<br class="clear" />
</s:if>
<s:else>
<s:hidden name="username"></s:hidden>
</s:else>
<s:password name="password" key="Password" cssClass="text-input" />
<br class="clear" />
<s:textfield name="email" cssClass="text-input" key="Email Address" />
<br class="clear" />
<s:textfield name="replyToEmail" key="Reply To Email" cssClass="text-input" />
<br class="clear" />
<s:submit align="center" value="Save" id="submitButton" cssClass="btn btn-primary" />
</div>
</form>
アクションは、以下のように検証にアノテーションを使用します -
@Validations(requiredStrings = {
@RequiredStringValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "firstName", key = "opd.error.name.required"),
@RequiredStringValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "lastName", key = "opd.error.name.required"),
@RequiredStringValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "username", key = "opd.error.username.required"),
@RequiredStringValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "password", key = "opd.error.password.required"),
@RequiredStringValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "email", key = "opd.error.email.required"),
@RequiredStringValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "replyToEmail", key = "opd.error.email.required")
},
emails = {
@EmailValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "email", key = "opd.error.email.format"),
@EmailValidator(type = ValidatorType.FIELD, shortCircuit=true, fieldName = "replyToEmail", key = "opd.error.email.format")})
public String update() {
パスワードを入力しないと、検証が正常に失敗し、パスワード ラベルとテキスト ボックスの上に正しいメッセージが表示されます。これはうまくいきます。
パスワードを入力しても、電子メールへの返信など、他の何かを省略した場合は機能しません。パスワード ラベルが表示される代わりに、「パスワード:」と表示されるはずの場所にパスワード自体が表示されます。たとえば、パスワードが abcd の場合、abcd がラベルとして表示されます。
編集 これは深刻なバグのようです。password の属性「key」を Password または password 以外に変更すると、ラベルとして表示されます。Struts 2 バージョン: 2.2.1