SpringBoot+Thymeleaf注册表单报错:No mapping for GET /index及循环视图路径
问题解答:SpringBoot + Thymeleaf学生注册表单应用异常处理
问题1:Student实体类需同时标注@jakarta.persistence.Id和@Id否则报错
原因分析
这是因为混用了Jakarta Persistence API与旧版Java EE Persistence API的注解。Spring Boot 3.x及以上版本全面迁移到Jakarta EE规范,对应的JPA注解包路径为jakarta.persistence;旧版javax.persistence下的@Id注解已被弃用,单独使用其中一种时,JPA无法正确识别主键配置,因此报错。
解决方案
- 统一使用Jakarta规范的注解,删除冗余的旧版注解,修正后的实体类代码:
import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @Entity public class Student { @Id // 此处@Id为jakarta.persistence.Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Long id; private String name; private String course; private String image; public Student() { } // 补充getter、setter方法(当前代码缺失,可能引发其他绑定问题) } - 确认项目依赖的
spring-boot-starter-data-jpa为Spring Boot 3.x版本,该版本默认依赖Jakarta Persistence API,无需额外引入旧版javax相关依赖。
问题2:jakarta.servlet.ServletException: Circular view path [error]: would dispatch back to the current handler URL [/error] again异常
原因分析
当应用发生未捕获异常(如表单参数绑定错误、数据库操作异常)时,Spring MVC默认错误处理机制会转发到/error路径,但项目中未配置对应的Thymeleaf视图(error.html),导致请求循环调用/error处理器,最终触发循环异常。
解决方案
以下两种方案任选其一:
方案1:创建自定义错误视图
在src/main/resources/templates目录下新建error.html文件,作为默认错误页面:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>操作错误</title> </head> <body> <h2>操作失败</h2> <p th:text="${message}">请检查输入或稍后重试</p> </body> </html>
方案2:在Controller中添加错误处理方法
修改StudentController,新增处理/error路径的方法:
@Controller @RequestMapping("/") public class StudentController { @Autowired StudentService studentService; @GetMapping("/") public String index(Model model) { model.addAttribute("title", "Home Page"); model.addAttribute("student", new Student()); // 补充表单绑定对象 return "index"; } @RequestMapping(value = "/save", method = RequestMethod.POST) public String saveStudent(@ModelAttribute("student") Student std, HttpServletRequest request) { studentService.save(std); return "redirect:/"; } // 新增错误处理方法 @GetMapping("/error") public String handleError(Model model) { model.addAttribute("message", "操作出错,请检查输入格式"); return "error"; } }
额外代码修正点
你的index.html存在两处可能引发问题的代码:
- 表单绑定的
${student}对象未在index方法中添加到Model,需补充上述Controller中的model.addAttribute("student", new Student());代码。 - “Fee”对应的输入框代码无效,
th:each="image : {page.content}"属于错误用法,若要绑定实体类的image字段,应修改为:<div alight="left"> <tr> <label class="form-label" >Image路径</label> <td><input type="text" th:field="*{image}" class="form-control" placeholder="请输入图片路径" /></td> </tr> </div>
内容的提问来源于stack exchange,提问作者creative one2018
相关产品推荐
相关产品推荐

