Spring Boot表單驗(yàn)證錯(cuò)誤信息無(wú)法顯示在頁(yè)面上是什么原因?

Spring Boot表單驗(yàn)證錯(cuò)誤信息無(wú)法顯示在頁(yè)面上是什么原因?

spring Boot表單驗(yàn)證錯(cuò)誤信息頁(yè)面顯示問(wèn)題排查指南

spring boot應(yīng)用中,使用@Valid注解和Errors對(duì)象進(jìn)行表單驗(yàn)證時(shí),有時(shí)Controller層已捕獲錯(cuò)誤,但頁(yè)面卻無(wú)法顯示這些錯(cuò)誤信息。本文分析一個(gè)實(shí)際案例,講解如何解決thymeleaf模板中表單驗(yàn)證錯(cuò)誤信息渲染失敗的問(wèn)題。

問(wèn)題描述: 使用Spring Boot和Thymeleaf構(gòu)建表單,應(yīng)用@NotBlank和@Email注解進(jìn)行驗(yàn)證。Controller層能正確獲取錯(cuò)誤信息,但Thymeleaf模板無(wú)法顯示錯(cuò)誤提示。

代碼分析:

TestUser.Java (表單實(shí)體類):

@Data @Entity @AllArgsConstructor @NoArgsConstructor(Access = AccessLevel.PUBLIC, force = true) public class TestUser {     @Id     @NotBlank(message = "用戶名必填")     private String name;      @Email(message = "郵箱格式錯(cuò)誤")     @NotBlank(message = "郵箱必填")     private String email;      @NotBlank(message = "密碼必填")     private String password; }

TestUserController.java (Controller):

@Controller @RequestMapping("/user") public class TestUserController {      @GetMapping     public String showRegisterForm(Model model) {         model.addAttribute("testuser", new TestUser()); // 直接在model中添加對(duì)象         return "user";     }      @PostMapping     public String register(@Valid TestUser testUser, BindingResult bindingResult) {         if (bindingResult.hasErrors()) {             return "user";         }         // ... 保存用戶數(shù)據(jù) ...         return "redirect:/";     } }

user.html (Thymeleaf模板):

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head>     <meta charset="UTF-8">     <title>用戶注冊(cè)</title>     <link rel="stylesheet" th:href="@{/styles.css}"> </head> <body>     <form th:action="@{/user}" th:Object="${testuser}" method="post">         <div th:if="${#fields.hasErrors('*')}">             <ul>                 <li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>             </ul>         </div>         <label for="name">用戶名:</label>         <input type="text" id="name" th:field="*{name}" /><br/>         <label for="email">郵箱:</label>         <input type="email" id="email" th:field="*{email}" /><br/>         <label for="password">密碼:</label>         <input type="password" id="password" th:field="*{password}" /><br/>         <button type="submit">注冊(cè)</button>     </form> </body> </html>

問(wèn)題根源及解決方案:

原代碼中Thymeleaf模板的th:object屬性與Controller中Model添加的對(duì)象名大小寫(xiě)不一致,導(dǎo)致Thymeleaf找不到正確的對(duì)象,無(wú)法顯示錯(cuò)誤信息。 解決方案: 確保th:object屬性與Controller中添加的Model屬性名完全一致(大小寫(xiě)敏感)。 另外,使用了BindingResult bindingResult代替Errors errors,這是Spring更推薦的方式。 并且在模板中,用th:if=”${#fields.hasErrors(‘*’)}”和th:each循環(huán)遍歷所有錯(cuò)誤信息,而不是單獨(dú)處理每個(gè)字段的錯(cuò)誤。 在showRegisterForm方法中,直接在model中添加testuser對(duì)象,避免了潛在的沖突。

通過(guò)以上修改,Thymeleaf模板能夠正確渲染表單驗(yàn)證錯(cuò)誤信息。 記住,在Spring mvc中,保持模型屬性名與Thymeleaf模板中th:object屬性名的一致性至關(guān)重要。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享