请稍等 ...
×

采纳答案成功!

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

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

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回答

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

1 回复 有任何疑惑可以回复我~
  • 提问者 慕田峪944480 #1
    额,确实不太清楚这样的原则,不过如果这么看的话,Controller假如不加入验证会有神马危害额……因为Service即使被远程调用,无论哪个Controller都会验证的吧……
    回复 有任何疑惑可以回复我~ 2020-03-30 20:20:29
  • 翔仔 回复 提问者 慕田峪944480 #2
    对于这里来讲,没啥危害,我们课程里面对校验做得不是很严谨,层层去做校验的原则,针对大型系统来讲,会去校验本层能够识别的东西,比如说,针对service层来讲,它后续需要调用哪些服务去处理,这些服务需要什么样的信息,service层是清楚的,所以service层需要对这些信息进行校验,而dao层对这些业务信息是不清楚的,所以它这边就不会去校验这些数据,转而会校验它所关系的数据,比如说数据库里必填的字段是否为空之类。
    此外,service层如果编程rpc服务,就会跳过controller层了,controller层只服务于web,service层可以单独抽出来,通过rpc来接收请求
    回复 有任何疑惑可以回复我~ 2020-03-31 01:30:51
  • 提问者 慕田峪944480 #3
    感觉懂了,如果本层需要相关的数据就需要校验,下一层同理
    回复 有任何疑惑可以回复我~ 2020-03-31 11:13:11
风之子陌 2020-03-30 00:53:07

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

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

1 回复 有任何疑惑可以回复我~
  • 翔仔 #1
    感谢同学的给力支持:)
    回复 有任何疑惑可以回复我~ 2020-03-30 02:17:56
  • 提问者 慕田峪944480 #2
    不知道我理解的对不对,假设从前端传来的数组只有priority,没有productCategoryName,那么会通过Controller层的if校验后调用Service层,但在Service层仍然会通过这层if校验吧……只是在if 内部调用到dao层操作数据库的时候报错,if内部的try...catch捕获然后抛出错误……所以还是无法理解Service层的这个else内的异常何时抛出吧……不知道能不能举个栗子,构造一个list能满足这个触发条件额。
    回复 有任何疑惑可以回复我~ 2020-03-30 12:20:45
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信