我在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) {
谢谢德克。

09-03 19:51