SpringBoot 如何优雅的进行参数校验

  • Post author:
  • Post category:其他


参数的合法性直接影响到程序的安全和性能,因此在进行相关操作前必须检测对象是否为null,是否为blank,是否被初始化等等。

我们先来看看SpringBoot 是如何来检验参数的。

f7be43101103a164a62b8804a9de256bca1.jpg

9e4955551e2dc6f60419449a095a4c7cad6.jpg

验证总是摆在第一位。

再来分析下Assert 类。 Assert  其实是一个非常简单的工具类。

cd88d6f07376b9d88bbdf2d76abcb7b4d4a.jpg

Assert 类作为一个工具类,不应该被实例化, 因此该类使用 abstract 进行修饰。 没错这就是经常遇到的面试题目, abstract 类不能被实例化。

除此之外 将构造方法使用 private 进行修饰也可以防止类被实例化,这也是常用的编程技巧之一。

Assert 类在SpringBoot 项目中被广泛使用。

9636cba34f6da024363e17d2aa58bd3ba58.jpg

为啥使用Assert 类? 因为使用Assert 能使得代码更加简洁明。三行代码变成一行代码,并且Controller 类不需要依赖具体的Exception 类,少依赖一种Exception, import语句减少一行。

@RequestMapping("edit")
    @RequiresPermissions(value = "fsdd-2")
    public String edit(@RequestParam @NonNull Long id, Model model) {
        Classify classify = classifyService.findById(id);

/*        if(classify == null){
            throw new EntityNotFoundException("被修改的分类不能为空" + id);
        }*/

        Assert.notNullEntity(classify, "被修改的分类不能为空" + id);

        model.addAttribute("classify", classify);
        return "manage/ClassifyController/edit";
    }

修改某条记录时 , id 参数是必须的,并且id不能为空, 并且根据id查询出来的实体对象也不能为空。 当然还必须处于登陆状态,并且拥有相关的角色权限。

到此我们只是验证了参数是否合法并且抛出了异常,但是并没有告诉用户后台发生了什么事情。

使用 @ControllerAdvice 和 @ExceptionHandler 可以捕获不同类型的错误,并且根据错误的类型给前台用户相应的反馈。

9ca5f2f2a359a965a2dad40e7979a692897.jpg

转载于:https://my.oschina.net/qidis/blog/3069790