商品编辑失败,productSevice.modifyProduct 返回空值,网页报错“商品为空”
来源:8-9 商品编辑之前端实现
树上的伯爵
2020-09-03
老师你好,我在进行前后端联调的时候,出现了错误,通过定位,我发现是以下语句出了问题:
ProductExecution pe = productService.modifyProduct(product, thumbnail, productImgList);
其中,我的数据库有 productId = 1 的商品,如下图:
调用了 modifyProduct 方法之后,返回的 pe 值如下图:
modifyProduct 对应的三个输入为:
product:
thumbnail:
ProductImgList:
对应的 modifyProduct 方法:
请问老师,这是哪里出了问题呢?找了很久没有找出来,谢谢
写回答
2回答
-
树上的伯爵
提问者
2020-09-04
老师你好,这是补充的 ProductManagementController 中的将 currentShop 设置到 product 的代码:
以及这是完整的 controller 中的modifyProduct 代码:
@RequestMapping(value = "/modifyproduct", method = RequestMethod.POST) @ResponseBody private Map<String, Object> modifyProduct(HttpServletRequest request) { Map<String, Object> modelMap = new HashMap<>(); // 判断何时调用,商品编辑时 or 上下架操作时调用 // 如果为前者,进行验证码判断;如果是后者则跳过验证码判断 boolean statusChange = HttpServletRequestUtil.getBoolean(request, "statusChange"); // 验证码判断 if (!statusChange && !CodeUtil.checkVerifyCode(request)) { modelMap.put("success", false); modelMap.put("errMsg", "输入了错误的验证码"); return modelMap; } // 接收前端参数变量的初始化,包括商品、缩略图、详情图列表实体类 ObjectMapper mapper = new ObjectMapper(); Product product = null; ImageHolder thumbnail = null; List<ImageHolder> productImgList = new ArrayList<>(); CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); // 若请求中存在文件流,则取出相关文件,包括详情图和缩略图 try { if (multipartResolver.isMultipart(request)) { thumbnail = handleImage(request, thumbnail, productImgList); } } catch (Exception e) { modelMap.put("success", false); modelMap.put("errMag", e.toString()); return modelMap; } try { String productStr = HttpServletRequestUtil.getString(request, "productStr"); // 尝试获取从前端传过来的表单 string 流并将其转换成 Product 实体类 product = mapper.readValue(productStr, Product.class); } catch (Exception e) { modelMap.put("success", false); modelMap.put("errMag", e.toString()); return modelMap; } // 非空判断,确保 Product 实体类不为空,就可以更新了;图片流是否传入无所谓 if (product != null) { try { // 从session中获取当前店铺的Id并赋值给product,减少对前端数据的依赖 Shop currentShop = (Shop) request.getSession().getAttribute("currentShop"); product.setShop(currentShop); // 开始进行商品信息变更操作 ProductExecution pe = productService.modifyProduct(product, thumbnail, productImgList); if (pe.getState() == ProductStateEnum.SUCCESS.getState()) { modelMap.put("success", true); } else { modelMap.put("success", false); modelMap.put("errMsg", pe.getStateInfo()); } } catch (RuntimeException e) { modelMap.put("success", false); modelMap.put("errMsg", e.toString()); return modelMap; } } else { modelMap.put("success", false); modelMap.put("errMsg", "请输入商品信息"); } return modelMap; }
00 -
翔仔
2020-09-04
同学好,首先需要同学全局搜索一下,看看"商品为空"这个异常从哪里来,就会发现是因为
if (product != null && product.getShop() != null && product.getShop().getShopId() != null) {
没满足这个if条件,没满足的原因是因为product.getShop()为空,也就是说你的商品没有标明是属于哪个店铺的,也就是说当你从店铺列表点击进某个店铺的时候,没有把店铺信息塞入session里面的currentShop里。
这类问题的定位属于比较简单的问题,下次一定要记得如何定位哈,加油
042020-09-05
相似问题