You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无法正确识别主键配置,因此报错。

解决方案

  1. 统一使用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方法(当前代码缺失,可能引发其他绑定问题)
    }
    
  2. 确认项目依赖的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存在两处可能引发问题的代码:

  1. 表单绑定的${student}对象未在index方法中添加到Model,需补充上述Controller中的model.addAttribute("student", new Student());代码。
  2. “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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:08:12