Thymeleaf 每个循环都给出错误

Thymeleaf each loop giving errors

我正在尝试在网页上打印错误 loginform.html 但 th:each="e:${#fields.errors('email')}" th:text ="${e}"

这是我的loginform.html代码

<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head>
    <meta charset="UTF-8" />
    <title>Log In</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
     
</head>
<body>

    <form th:action="@{/process}" method="post" th:object="${User}">
 
  <div class="form-group">
    <label for="username2">User name</label>
    <input type="text" class="form-control" id="username2" placeholder="username" name="username"/>
    <!-- <div  th:each="e : ${#fields.errors('username')}" th:text="${e}"  class="invalid-feedback">
          
        </div> -->   
  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">Email address</label>
    <input type="email" class="form-control" name="email" aria-describedby="emailHelp" placeholder="Enter email">
    <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
      <p  th:each="e:${#fields.errors('email')}" th:text="${e}"></p>
  </div>
  
  <div class="form-group form-check">
    <input type="checkbox" class="form-check-input"  name="agreed">
    <label class="form-check-label" for="exampleCheck1">Check me out</label>
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
    
</body>
</html>

控制器代码:

package com.validation.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.validation.BindingResult;
import com.validation.entities.User;

@Controller
public class FormController {
    
    @GetMapping("/form")
    public String form()
    {
        
            
            return "loginform";
        
    }
    
    
    @PostMapping("/process")
    public String process(@Valid @ModelAttribute("User") User user,BindingResult result )
    {
    
        if(result.hasErrors())
        {
            System.out.println(result);
            
            return "loginform";
        }
        
        return "success";
    }
    

}

User.java代码:

package com.validation.entities;

import java.util.List;

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

public class User {
    
    @NotBlank(message="User name can't be blank")
    @Size( min=3,max=12 ,message="User name must be between 3-12 chars.")
    private String username;
    
    @Email(regexp="^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$", message="invalid email")
    private String email;
    
    @AssertTrue
    private boolean agreed;
    
    //public List<Integer> list= List.of(1,2,3,4,5);
    
    public boolean isAgreed() {
        return agreed;
    }
    public void setAgreed(boolean agreed) {
        this.agreed = agreed;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", email=" + email + "]";
    }
    public void setEmail(String email) {
        this.email = email;
    }

}

错误是: 白标错误页面 此应用程序没有 /error 的显式映射,因此您将其视为后备。

12 月 8 日星期三 11:15:55IST 2021 出现意外错误(类型=内部服务器错误,状态=500)。 模板解析时发生错误(模板:“class路径资源[templates/loginform.html]”) org.thymeleaf.exceptions.TemplateInputException:模板解析时发生错误(模板:“class路径资源[templates/loginform.html]”) 在 org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) 在 org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse 独立 (AbstractMarkupTemplateParser.java:100) 在 org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) 在 org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) 在 org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) 在 org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:366) 在 org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:190) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1400) 在 org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:655) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:764) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) 在 org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "#fields.errors('email')" (template: "loginform" - 第 28 行,第 11 列) 在 org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) 在 org.attoparser.MarkupParser.parse(MarkupParser.java:257) 在 org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 48 更多 Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#fields.errors('email')" (模板:“loginform” - 第 28 行,第 11 栏) 在 org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) 在 org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166) 在 org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) 在 org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) 在 org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) 在 org.thymeleaf.standard.expression.Expression.execute(Expression.java:125) 在 org.thymeleaf.standard.processor.StandardEachTagProcessor.doProcess(StandardEachTagProcessor.java:73) 在 org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) 在 org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) 在 org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) 在 org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) 在 org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleOpenElementEnd(TemplateHandlerAdapterMarkupHandler.java:304) 在 org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:278) 在 org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleOpenElementEnd(OutputExpressionInlinePreProcessorHandler.java:186) 在 org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:124) 在 org.attoparser.HtmlElement.handleOpenElementEnd(HtmlElement.java:109) 在 org.attoparser.HtmlMarkupHandler.handleOpenElementEnd(HtmlMarkupHandler.java:297) 在 org.attoparser.MarkupEventProcessorHandler.handleOpenElementEnd(MarkupEventProcessorHandler.java:402) 在 org.attoparser.ParsingElementMarkupUtil.parseOpenElement(ParsingElementMarkupUtil.java:159) 在 org.attoparser.MarkupParser.parse 缓冲区(MarkupParser.java:710) 在 org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) ... 50 多个 由以下原因引起:java.lang.IllegalStateException:bean 名称 'User' 的 BindingResult 和普通目标对象都不能用作请求属性 在 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:153) 在 org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) 在 org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227) 在 org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306) 在 org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253) 在 org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227) 在 org.thymeleaf.spring5.util.FieldUtils.computeErrors(FieldUtils.java:98) 在 org.thymeleaf.spring5.util.FieldUtils.errors(FieldUtils.java:85) 在 org.thymeleaf.spring5.expression.Fields.errors(Fields.java:74) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:129) 在 org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:139) 在 org.springframework.expression.spel.ast.MethodReference.access000 美元(MethodReference.java:55) 在 org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:387) 在 org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(化合物Expression.java:92) 在 org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:112) 在 org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:337) 在 org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ... 还有 70 个

您的获取方法不完整。您通过 th:object=${user} 定义的对象在模型属性映射中不存在。

在这种情况下错误是明确的:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'User' available as request attribute at org.springframework.web.servlet.support.BindStatus.(BindStatus.java:153)

修改get映射:

@GetMapping("/form")
public ModelAndView form(ModelAndView modelAndView) {
  User user = new User(); // or however you want to fetch the user entity / dto
  modelAndView.addObject("user", user);
  modelAndView.setViewName("loginform");

  return modelAndView;
}