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

来源:8-9 商品编辑之前端实现

树上的伯爵

2020-09-03

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

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

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

写回答

2回答

树上的伯爵

提问者

2020-09-04

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

//img.mukewang.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
0

翔仔

2020-09-04

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

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

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

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

0
4
树上的伯爵
回复
翔仔
老师你好,我已经解决了。原来是忘记刷新了http://localhost:8080/o2o/shopadmin/shopmanagement?shopId=1 导致shopid没有获取 。。。
2020-09-05
共4条回复

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程