昨日は動作していましたが、何かをした後、何時間も修正しようとしてきましたが、もう動作しません。
ユーザーが間違った情報を入力したときに、.properties ファイルから<form:form>
カスタム エラー メッセージ ( ) を表示したい を含む Spring MVC アプリがあります。<form:errors>
「間違っている」とは、JSR-303 アノテーションで定義されています。
フォームからの抜粋:
<form:form method="post" action="adduserprofile" modelAttribute="bindableUserProfile">
<table>
<tr>
<td><form:label path="firstName">Voornaam</form:label></td>
<td>
<form:input path="firstName"/>
<form:errors path="firstName" />
</td>
</tr>
<tr>
<td><form:label path="lastName">Achternaam</form:label></td>
<td>
<form:input path="lastName"/>
<form:errors path="lastName" />
</td>
</tr>
BindableUserProfile からの抜粋:
@NotNull
@Size(min = 3, max = 40, message="{errors.requiredfield}")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@NotNull
@Size(min = 3, max = 40, message="errors.requiredfield")
public String getLastName() {
return lastName;
}
コントローラーからの抜粋:
@RequestMapping(value = "/edit/{userProfileId}", method = RequestMethod.GET)
public String createOrUpdate(@PathVariable Long userProfileId, Model model) {
if (model.containsAttribute("bindableUserProfile")) {
model.addAttribute("userProfile", model.asMap().get("bindableUserProfile"));
} else {
UserProfile profile = userProfileService.findById(userProfileId);
if (profile != null) {
model.addAttribute(new BindableUserProfile(profile));
} else {
model.addAttribute(new BindableUserProfile());
}
}
model.addAttribute("includeFile", "forms/userprofileform.jsp");
return "main";
}
@RequestMapping(value = "/adduserprofile", method = RequestMethod.POST)
public String addUserProfile(@Valid BindableUserProfile userProfile, BindingResult result, Model model) {
if (result.hasErrors()) {
return createOrUpdate(null, model);
}
UserProfile profile = userProfile.asUserProfile();
userProfileService.addUserProfile(profile);
return "redirect:/userprofile";
}
application-context.xml からの抜粋
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages/messages"/>
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource">
<ref bean="messageSource"/>
</property>
</bean>
resources/messages には、messages_en.properties と messages_nl.properties の 2 つのファイルがあります。どちらも同じ、単純な内容です。
errors.requiredfield=This field is required!!!
- 空の名前でフォームを送信すると、コントローラ メソッド 'addUserProfile()' でエラーが実際に見つかったことがわかります。
- 空の名前でフォームを送信すると、フィールドの横にメッセージ識別子が表示されます。つまり、姓の場合は「errors.requiredfield」または「{errors.requiredfield}」というリテラル テキストです。
- メッセージ属性の値を「Foo」に変更すると、「Foo」がエラー メッセージとして表示されます。したがって、エラーメカニズム自体は正常に機能しているようです。
- ベース名を変更すると、プロパティ ファイルが見つからないと表示されるため、application-context.xml の messageSource Bean は正しくなければなりません。
- 空の入力は、NotNull 注釈によってキャッチされません。Spring は、空の入力を null ではなく空の文字列と見なします。
したがって、プロパティ ファイルが見つかり、検証アノテーションが適切に処理されているように見えますが、Spring は、メッセージ キーをプロパティ ファイルからのメッセージに置き換える必要があることを理解していません。