请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

商品编辑失败,productSevice.modifyProduct 返回空值,网页报错“商品为空”

老师你好,我在进行前后端联调的时候,出现了错误,通过定位,我发现是以下语句出了问题:

ProductExecution pe = productService.modifyProduct(product, thumbnail, productImgList);

其中,我的数据库有 productId = 1 的商品,如下图:
图片描述
调用了 modifyProduct 方法之后,返回的 pe 值如下图:
PE取值
modifyProduct 对应的三个输入为:
product:
Product
thumbnail:
Thumbnail
ProductImgList:
ProductImgList
对应的 modifyProduct 方法:
modifyProduct
请问老师,这是哪里出了问题呢?找了很久没有找出来,谢谢

正在回答 回答被采纳积分+3

2回答

提问者 树上的伯爵 2020-09-04 09:28:32

老师你好,这是补充的 ProductManagementController 中的将 currentShop 设置到 product 的代码:

https://img1.sycdn.imooc.com//szimg/5f51980d093d45e713120855.jpg


以及这是完整的 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;
}


0 回复 有任何疑惑可以回复我~
翔仔 2020-09-04 00:50:42

同学好,首先需要同学全局搜索一下,看看"商品为空"这个异常从哪里来,就会发现是因为

if (product != null && product.getShop() != null && product.getShop().getShopId() != null) {

没满足这个if条件,没满足的原因是因为product.getShop()为空,也就是说你的商品没有标明是属于哪个店铺的,也就是说当你从店铺列表点击进某个店铺的时候,没有把店铺信息塞入session里面的currentShop里。

这类问题的定位属于比较简单的问题,下次一定要记得如何定位哈,加油

0 回复 有任何疑惑可以回复我~
  • 提问者 树上的伯爵 #1
    老师你好,我按照你说的定位到了 ProductManagementController 中的 modifyProduct 方法,并找到了 getsession 语句。发现我已经在这个地方将其放入 currentShop 了,麻烦老师再分析一下我上面贴出的代码,谢谢!
    回复 有任何疑惑可以回复我~ 2020-09-04 09:30:37
  • 翔仔 回复 提问者 树上的伯爵 #2
    是放入currentShop了,但是调试的时候同学看到没,你的product.getShop是空,所以看看你的CurrentShop为什么没有值
    回复 有任何疑惑可以回复我~ 2020-09-05 02:11:40
  • 提问者 树上的伯爵 回复 翔仔 #3
    好的,谢谢老师!
    回复 有任何疑惑可以回复我~ 2020-09-05 07:40:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信