You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf页面模型字段错误不显示及BindingResult异常求助

Thymeleaf #fields.errors() 无法显示校验信息并抛出异常

在使用Thymeleaf的#fields.errors()方法收集所有校验信息时,发现该方法无法在HTML页面显示错误信息,还会抛出异常。已尝试多种错误捕获方法,问题仍未解决。

核心错误提示

Neither BindingResult nor plain target object for bean name 'user' available as request attribute

错误堆栈详情

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153)
    at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903)
    at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227)
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306)
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253)
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227)
    at org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174)
    at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
    ... 69 more
    
    Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "user_login" - line 28, col 21)
    at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
    at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
    ... 48 more
    Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "user_login" - line 28, col 21)

控制器代码

@GetMapping("/user_login")
public String getUserLoginPage(Model model){
    LoginModel user_model  = new LoginModel();
    model.addAttribute("title", "User Login Page");
    model.addAttribute("user", user_model);
    return "user_login";
}

// 用户登录处理器
@PostMapping("/process_user_login")
public String processUserLogin(
    @Valid @ModelAttribute LoginModel user,
    BindingResult bindingResult,Model model){
    
    if(bindingResult.hasErrors()){
        logger.info("用户登录表单存在错误");

        return "user_login";
    }
    model.addAttribute("user", user);
    return "user_login";
}

模型类代码

package com.attendance.model;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

public class LoginModel {

    @NotBlank(message = "邮箱不能为空")
    @Size(min = 3, max = 20, message = "长度需在3-20字符之间" )
    private String userEmail;

    @NotBlank(message = "密码不能为空")
    private String password;

    public LoginModel() {
        super();
    }
    
    public LoginModel(String userEmail, String password) {
        super();
        this.userEmail = userEmail;
        this.password = password;
    }
    public String getUserEmail() {
        return userEmail;
    }
    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }
    public String getPassword() {
        return password;    
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "LoginModel [userEmail=" + userEmail + ", password=" + password + "]";
    }

}

HTML视图代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" th:replace="base::layout(~{::section})">
   <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <style rel="stylesheet" th:href="@{/css/userlogin.css}" ></style>
      <title>首页 </title>
   </head>
   <body>
      <section>
         <div class="card card-container mb-4 pb-5">
            <!-- <img class="profile-img-card" src="//lh3.googleusercontent.com/-6V8xOA6M7BA/AAAAAAAAAAI/AAAAAAAAAAA/rzlHcD0KYwo/photo.jpg?sz=120" alt="" /> -->
            <img id="profile-img" class="profile-img-card" src="//ssl.gstatic.com/accounts/ui/avatar_2x.png" />
            <p id="profile-name" class="profile-name-card"></p>
            <form th:object="${user}" th:action="@{/process_user_login}" method="post" class="form-signin">
               <span id="reauth-email" class="reauth-email"></span>
               <input 
                  type="email"
                  name="userEmail"
                  th:field="*{userEmail}"
                  id="inputEmail" 
                  class="form-control" 
                  placeholder="邮箱地址"
                  autofocus />
               <p th:if="${#fields.hasErrors('userEmail')}" >输入格式错误</p>
               <!--  <p th:each="e : ${#fields.errors('userEmail')}" th:text="${e}" ></p> -->
               <input 
                  type="password" 
                  name="password"
                  th:field="*{password}"
                  id="inputPassword" 
                  class="form-control" 
                  placeholder="密码" />
               <div id="remember" class="checkbox">
                  <label>
                  <input type="checkbox" value="remember-me"> 记住我
                  </label>
               </div>
               <button class="btn btn-lg btn-primary btn-block btn-signin" type="submit">登录</button>
            </form>
            <!-- /form -->
            <a href="#" class="forgot-password">
            忘记密码?
            </a>
         </div>
         <!-- /card-container -->
      </section>
   </body>
</html>

内容的提问来源于stack exchange,提问作者Jitendra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:35:17