SpringBoot查询全量产品返回500错误,新增产品已成功存入数据库
问题根因
你遇到的报错是JPA双向关联搭配Lombok @Data 注解引发的循环调用栈溢出,完全符合你描述的「数据成功入库但跳转页面时报错」的现象:
@Data注解会自动为实体类生成hashCode()、equals()、toString()方法Categories和Products是双向一对多关联:分类实体包含关联产品集合,产品实体包含关联分类引用- 调用任意一方的hashCode/toString时,会自动调用关联对象的对应方法,形成死循环,最终触发StackOverflowError
- 报错发生在跳转后渲染产品列表页的阶段,此时产品已经完成入库操作,和你观测到的现象一致
修复方案
1. 修正实体类注解,打破循环依赖
两个实体类不要直接使用@Data,改用组合注解,排除关联字段的hash/equals/toString逻辑:
Categories 实体修改:
@Entity @Getter @Setter @ToString(exclude = "product_category") // 排除关联产品集合,避免toString循环 @EqualsAndHashCode(exclude = "product_category") // 排除关联字段,避免hash/equals循环 public class Categories { // 原有字段、构造方法、get/set保持不变 }
Products 实体修改:
@Entity @Table(name = "Products") @Getter @Setter @ToString(exclude = "product_category") // 排除关联分类对象 @EqualsAndHashCode(exclude = "product_category") public class Products { // 原有字段、构造方法、get/set保持不变 }
2. 修复产品列表页的分类展示逻辑
你当前直接输出${product.product_category}会调用分类对象的toString,改成直接取分类名称字段即可:
<!-- 将products.html中原有的分类展示td替换为下面的代码 --> <td th:text="${product.product_category.categoryName}" ></td>
3. 修复新增产品表单的分类绑定逻辑
你当前的分类下拉框只提交分类ID,SpringMVC无法自动转换为Categories对象,补充全局转换器即可:
首先修改create_product.html中的下拉框代码:
<select class="form-control form-control-sm" id="category" th:field="*{product_category}"> <option value=""> Select Category </option> <option th:each = "category: ${category}" th:value="${category.categories_id}" th:text="${category.categoryName}"> </option> </select>
新增全局类型转换器,SpringBoot会自动注册生效:
@Component public class CategoriesConverter implements Converter<String, Categories> { @Autowired private CategoriesRepository categoriesRepository; @Override public Categories convert(String source) { Long id = Long.valueOf(source); return categoriesRepository.findById(id).orElse(null); } }
内容的提问来源于stack exchange,提问作者Hesham Eldawy
相关产品推荐
相关产品推荐

