我在Thymeleaf上使用Spring Boot 2.4.1,在Ubuntu 20.10上使用OpenJDK 11.0.9.1。我已经用@NotNull和其他标签标记了实体,并且@Valid标签在处理POST请求的 Controller 方法中似乎工作正常,因为在出错时它将返回我到原始页面。但是,Thymeleaf模板中的th:if...th:errors
无法正常显示相应的错误消息。
Thymeleaf模板(/editor
)包括以下形式:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<body>
...
<form method="POST" th:object="${competence}">
<h3>Additional information</h3>
<label for="compname">Name:</label>
<input type="text" id="compname" th:field="*{name}" />
<span class="validationError"
th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Error</span><br/>
<label for="compdesc">Description:</label>
<textarea class="description" id="compdesc" th:field="*{description}" />
<button>Regístrala</button>
</div>
</form>
而 Controller 包括一种用于处理POST请求的方法:@Slf4j
@Controller
@RequestMapping("/editor")
public class CompetenceEditorController {
...
@PostMapping
public String processCompetence(@Valid CompetenceEntity competence,
final BindingResult bindingResult, final Model model) {
// Checking for errors in constraints defined in the class CompetenceEntity.
if (bindingResult.hasErrors()) {
return "editor";
} else {
// Save the competence
log.info("Processing competence: " + competence);
CompetenceEntity saved = competenceRepository.save(competence);
return "redirect:/competence-saved";
}
}
如果我填写名称和描述,则过程继续,但是如果我将名称保留为空,则代码会将我发送回/editor
页面,但没有错误消息。在错误之前和之后,span
元素消失。编辑
我以为@ dirk-deyne的建议是可行的,但只有在以下情况下才能这样做:(1)我在先前的代码上运行Spring Boot,(2)我将名称留空(并且我回到同一页面而没有错误消息) ,(3)我启动了Boot,“修复”了代码,然后再次运行它,(4)一次又一次地将名称留空。
但是,如果我离开页面,然后再次返回,则会收到错误消息:
There was an unexpected error (type=Internal Server Error, status=500).
An error happened during template parsing (template: "class path resource [templates/editor.html]")
...
Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "editor" - line 51, col 46)
第51行在哪里 <input type="text" id="compname" th:field="*{name}" />
第46列(包括空格)是th:field
的开头。顺便说一下,@GetMapping方法具有以下行 model.addAttribute("competence", new CompetenceEntity());
这就是为什么我使用th:object="${competence}"
而不是th:object="${competenceEntity}"
的原因。 最佳答案
好吧,解决方案是were Dirk Deyne said。通过使用competence
将Thymeleaf中的competence
与@PostMapping
方法中的@ModelAttribute("competence")
链接来解决此问题:
@PostMapping
public String processCompetence(
@Valid @ModelAttribute("competence") CompetenceEntity competence,
final BindingResult bindingResult, final Model model) {
谢谢德克。