Spring Boot项目创建产品后列表页分类显示异常如何解决?
问题修复方案
你遇到的分类列显示对象地址的问题由3处错误共同导致,按以下步骤修复即可:
1. 修正产品列表页的取值逻辑
你在products.html中直接输出Categories对象,模板会默认调用对象的toString()方法,输出的就是内存地址。将分类列的代码修改为取分类的categoryName属性:
<!-- 原来的错误代码 --> <!-- <td th:text="${product.product_category}" ></td> --> <!-- 修改后的正确代码 --> <td th:text="${product.product_category.categoryName}" ></td>
2. 修复表单提交时的分类绑定逻辑
你在创建产品的表单中提交的是分类ID(数字字符串),Spring MVC默认无法自动将字符串ID转换为Categories实体对象,导致保存到数据库的产品关联分类异常。修改ProductsController的saveProduct方法,手动根据提交的分类ID查询正确的分类实体再关联:
@RequestMapping(value = "/products/create_product",method = RequestMethod.POST) public String saveProduct(@ModelAttribute("product") Products product, @RequestParam("product_category") Long categoryId) { // 手动查询分类实体 Categories category = categoriesRepository.findById(categoryId).orElseThrow(() -> new IllegalArgumentException("无效的分类ID:" + categoryId)); product.setProduct_category(category); productService.saveProduct(product); return "redirect:/products/all_products"; }
同时调整更新产品的方法,也添加同样的分类绑定逻辑:
@RequestMapping(value = "/products/update_product/{id}",method=RequestMethod.POST) public String updateProduct(@PathVariable Long id, @ModelAttribute("product") Products product, Model model, @RequestParam("product_category") Long categoryId) { Products existingProduct = productService.getProductById(id); existingProduct.setProduct_id(id); existingProduct.setProduct_name(product.getProduct_name()); existingProduct.setProduct_price(product.getProduct_price()); // 手动设置更新后的分类 Categories category = categoriesRepository.findById(categoryId).orElseThrow(() -> new IllegalArgumentException("无效的分类ID:" + categoryId)); existingProduct.setProduct_category(category); existingProduct.setProduct_quantity(product.getProduct_quantity()); existingProduct.setProduct_Section(product.getProduct_Section()); existingProduct.setProduct_ExpDate(product.getProduct_ExpDate()); productService.updateProduct(existingProduct); return "redirect:/products/all_products"; }
3. 解决懒加载导致的属性读取异常
你在Products实体类中给product_category关联设置的是FetchType.LAZY懒加载,查询产品时不会同步查询分类数据,直接在模板中访问categoryName会抛出懒加载未初始化异常。可以选择以下两种方案之一解决:
- 方案一:将关联的加载策略改为立即加载,修改
Products实体的注解:
@ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "categories_id") private Categories product_category;
- 方案二:修改
ProductRepository的查询方法,使用join fetch同步加载关联的分类数据,避免懒加载问题:
// 在ProductRepository接口中添加该方法 @Query("SELECT p FROM Products p JOIN FETCH p.product_category") List<Products> findAllWithCategory();
再修改ProductServiceImp的getAllProducts方法调用该查询:
@Override public List<Products> getAllProducts() { return this.productRepository.findAllWithCategory(); }
内容的提问来源于stack exchange,提问作者Hesham Eldawy
相关产品推荐
相关产品推荐

