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;
}
我正在尝试在网页上打印错误 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;
}