Controller层已经验证过ProductCategoryList是否为null或者空列表,为什么Service层还要再验证

来源:7-3 商品类别批量添加后端开发

慕田峪944480

2020-03-29

ProductCategoryManagementController 中

    @RequestMapping(value = "/addproductcategories", method = RequestMethod.POST)
    @ResponseBody
    private Map<String, Object> addProductCategories(@RequestBody List<ProductCategory> productCategoryList, HttpServletRequest request) {
        Map<String, Object> modelMap = new HashMap<>();
        Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");
        for (ProductCategory productCategory : productCategoryList) {
            productCategory.setShopId(currentShop.getShopId());
        }
        if (productCategoryList != null && productCategoryList.size() > 0) {
        ...
        } else {
            modelMap.put("success", false);
            modelMap.put("errMsg","请至少输入一个商品类别");
        }
        

ProductCategoryServiceImpl

    @Override
    public ProductCategoryExecution batchAddProductCategory(List<ProductCategory> productCategoryList) throws ProductCategoryOperationException {
        if (productCategoryList != null && productCategoryList.size() > 0) {
        ...
        } else {
            return new ProductCategoryExecution(ProductCategoryStateEnum.EMPTY_LIST);
        }

如果在Controller层发现这个数组为空了,就不会触发Service层的return new ProductCategoryExecution(ProductCategoryStateEnum.EMPTY_LIST);了吧……

所以不是很理解额。

写回答

2回答

翔仔

2020-03-30

同学好,这里再次重复验证主要考虑是层与层之间不进行相互信任的原则,主要是为程序的扩展做准备,比如日后我们单独将Service层剥离出来,作为rpc服务对外去提供服务,当然这个只是假设:)

1
4
翔仔
回复
慕田峪944480
是的哈,本层只验证本层能理解的
2020-04-01
共4条回复

风之子陌

2020-03-30

同学,你可以这样想。批量添加商品类别那里有两个要填的数据,一个是priority,一个是productCategoryName。假如你只填了priority数据,那么返回的productCategoryList 既不为空,size()也大于0,那么将执行Service的操作

而数据库中设置的product_category_name字段是非空的,所以插入会报错,所以需要RuntimeExcption来触发回滚

1
2
慕田峪944480
不知道我理解的对不对,假设从前端传来的数组只有priority,没有productCategoryName,那么会通过Controller层的if校验后调用Service层,但在Service层仍然会通过这层if校验吧……只是在if 内部调用到dao层操作数据库的时候报错,if内部的try...catch捕获然后抛出错误……所以还是无法理解Service层的这个else内的异常何时抛出吧……不知道能不能举个栗子,构造一个list能满足这个触发条件额。
2020-03-30
共2条回复

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

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

5113 学习 · 8144 问题

查看课程