首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Thymeleaf不显示Spring表单错误消息

Thymeleaf不显示Spring表单错误消息
EN

Stack Overflow用户
提问于 2014-04-09 05:10:32
回答 3查看 60.8K关注 0票数 34

我正在将一个Spring jsp应用程序迁移到Thymeleaf,但是在显示表单错误时遇到了问题。

我使用的是SpringTemplateEngine和ThymeleafViewResolver,并且模板的渲染工作正常。表单值也填充在表单输入字段中。

到目前为止,唯一不起作用的是显示表单错误消息。

我的控制器看起来像:

代码语言:javascript
复制
@RequestMapping(method = RequestMethod.POST)
String save(@Valid CustomerForm form, BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes) {
    if (bindingResult.hasErrors()) {
        model.addAttribute("form", form)
        return "app/customers/create"
    }
    ....

我打印了bindingResult以验证它是否包含错误:

代码语言:javascript
复制
binding result = org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'customerForm' on field 'name': rejected value []; codes [customerForm.name.NotBlank,name.NotBlank,java.lang.String.NotBlank,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [customerForm.name,name]; arguments []; default message [name]]; default message [may not be empty]

当我尝试使用以下命令显示错误时:

代码语言:javascript
复制
<ul>
    <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr">
        <span th:text="${e.global}? '*' : ${e.fieldName}">The field name</span> |
        <span th:text="${e.message}">The error message</span>
    </li>
</ul>

它不会显示任何错误。

我尝试了http://www.thymeleaf.org/doc/html/Thymeleaf-Spring3.html#validation-and-error-messages上记录的各种替代方案,但都没有成功。

我是不是遗漏了什么?

编辑

注意:我试图在通过th:object设置的表单中显示错误:

代码语言:javascript
复制
<form id="customer-form" action="#" th:action="@{/app/customers}" th:object="${form}" method="post" class="form-horizontal">
    <ul>
        <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr">
            <span th:text="${e.global}? '*' : ${e.fieldName}">The field name</span> |
            <span th:text="${e.message}">The error message</span>
        </li>
    </ul>
</form>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-12 03:35:30

我想你可能和我有同样的问题--请看:

在那里,它由Daniel Fernandez回答。基本上,您的表单对象th:object="${form}"被命名为"form" ,但是您的控制器查找的是"customerForm" (类名),而不是 "form" (变量名)

可以使用@ModelAttribute("data")重命名

使用以下链接从该链接复制:

代码语言:javascript
复制
public String post(@Valid FormData formData, BindingResult result, Model model){
    // th:object="${formData}"
}

代码语言:javascript
复制
public String post(@Valid @ModelAttribute("data") FormData data, BindingResult result, Model model){
    // th:object="${data}"
} 
票数 71
EN

Stack Overflow用户

发布于 2014-04-10 16:22:48

我在表单中是这样做的:

为了显示所有错误,我将以下代码放在表单的开头:

代码语言:javascript
复制
<div class="alert alert-danger" th:if="${#fields.hasErrors('*')}">
    <p th:each="err : ${#fields.errors('*')}" th:text="${err}"></p>    
</div>

对于个别错误,我会在字段后面添加以下内容(当然,将hasErrors中的字段更改为与测试的字段相对应):

代码语言:javascript
复制
<p th:if="${#fields.hasErrors('vehicle.licensePlate')}" class="label label-danger" th:errors="*{vehicle.licensePlate}">Incorrect LP</p>

让我知道这对你是否有效?

票数 16
EN

Stack Overflow用户

发布于 2017-08-07 02:01:23

添加到@Blejzer答案: messages.properties文件内错误消息的命名必须遵循以下命名约定,因此将返回消息字符串而不是消息键:

(约束名称).(对象名称).(属性名称)

注意:对象名不是类名

例如,如果您具有以下User类:

代码语言:javascript
复制
class User{
    @NotBlank
    String username;

    @Length(min=6)
    String password;
}

假设在控制器中,我们将验证下的对象命名为"user",请参见@ModelAttribute("user"):

代码语言:javascript
复制
@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String signup(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model model) {

    if (bindingResult.hasErrors()) {
        return "signup";
    }

    //do some processing

    return "redirect:/index";
}

在上面的控制器片段中,对象名是"user“而不是"User”。

现在,要显示自定义消息,您必须按如下方式命名消息:

代码语言:javascript
复制
NotBlank.user.username=User Name is blank
Length.user.password=Password length must be at least 6 letters
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22948257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档