bal*_*teo 2 spring-mvc bean-validation thymeleaf
我和Thymeleaf一起使用Spring MVC.我对Thymeleaf有一个问题,fields.hasErrors
如下:
当引发Bean Validation约束错误(例如@NotNull约束)时,以下使用fields.hasErrors
完美地起作用:
<span class="help-inline" th:if="${#fields.hasErrors('member.email')}" th:text="#{message_form.validation.email}"></span>
Run Code Online (Sandbox Code Playgroud)
电子邮件字段旁边显示错误消息确定.
但是,当我的代码引发"特定于应用程序"的错误(与Bean Validation约束错误相反)时(请参阅下面的控制器中的代码),
// FROM SPRING MVC CONTROLLER
if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
bindingResult.addError(new ObjectError("member.email", "email already used")); // TODO i18n
}
Run Code Online (Sandbox Code Playgroud)
在th:if="${#fields.hasErrors('member.email')}"
不计算为真,并显示错误消息....
我发现显示这些"特定于应用程序"错误的唯一方法是在表单下面包含以下内容:
<div id="errors" class="alert alert-error">
<ul th:if="${#fields.hasErrors('*')}">
<li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
然后,它将显示" 已使用的电子邮件 "作为列表项.
任何人都可以请澄清行为,th:if="${#fields.hasErrors('member.email')}"
特别是告诉我为什么它会在"特定于应用程序"错误的情况下评估为false?
我找到了解决方案:我的问题来自Spring API的错误使用.
我应该用一个FieldError
而不是一个ObjectError
.
所以改变自:
//FROM SPRING MVC CONTROLLER
if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
bindingResult.addError(new ObjectError("member.email", "email already used"));//TODO i18n
}
Run Code Online (Sandbox Code Playgroud)
至
//FROM SPRING MVC CONTROLLER
if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
bindingResult.addError(new FieldError("registrationInfo","member.email", "email already used"));//TODO i18n
}
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
归档时间: |
|
查看次数: |
4500 次 |
最近记录: |