zoukankan      html  css  js  c++  java
  • 解放生产力:Spring Boot的注解校验

    关于对象入参的校验,我们可能第一个想到的就是在Controller层或者Service层增加很多if else的判断,如:

    if (user.getPassword() == "") {
        throw new BusinessException("password can not be empty!");
    }
    
    if (user.getRank() > 30 || user.getRank() <= -1) {
         throw new BusinessException("The value of the rank should be in valid range");
    }
     // other codes 
    

    这样一路写下来非常容易心态暴躁,时间久了也会越来越冗余。Spring Boot提供了一个通过注解就能实现的字段验证方法。常用的注解如下:

    //被注释的元素必须为null
    @Null  
    //被注释的元素不能为null
    @NotNull  
    //被注释的元素必须为true
    @AssertTrue  
    //被注释的元素必须为false
    @AssertFalse  
    //被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @Min(value)  
    //被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @Max(value)  
    //被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @DecimalMin(value)  
    //被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @DecimalMax(value)  
    //被注释的元素的大小必须在指定的范围内。
    @Size(max,min) 
    //被注释的元素必须是一个数字,其值必须在可接受的范围内
    @Digits(integer,fraction) 
    //被注释的元素必须是一个过去的日期 
    @Past  
    //被注释的元素必须是一个将来的日期
    @Future  
    //被注释的元素必须符合指定的正则表达式。
    @Pattern(value) 
    //被注释的元素必须是电子邮件地址
    @Email 
    //被注释的字符串的大小必须在指定的范围内
    @Length 
    //被注释的字符串必须非空
    @NotEmpty  
    //被注释的元素必须在合适的范围内
    @Range  
    

    而我们选出最高频的三个:
    @NotNull用于Integer Double等类型
    @NotBlank 用于String字符串
    @NotEmpty 用于集合类或者数组。

    这些验证注解都写在Bean对象,也就是pojo或者dao层文件中,下面举个栗子:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class MyArticle {
        // 文章ID
        private int id;
        // 文章标题
        @NotBlank(message = "文章标题不能是空")
        private String title;
        // 文章作者
        @NotBlank(message = "作者名不能是空")
        private String author;
        // 文章内容
        @NotBlank(message = "文章内容不能是空")
        private  String content;
        // 文章分类ID
        @NotNull(message = "分类ID不能为空")
        private int categoryId;
        // 标签
        @NotEmpty(message = "标签不能为空")
        private List<String> tags;
        // 创建时间
        private int created;
        // 修改时间
        private int modified;
    }
    

    然后在对应的Controller接口中需要被验证的入参上增加一个注解@Validated即可,然后通过BindingResult对象来获取判断后的处理结果:

    @PostMapping("/article")
        @UserLoginToken
        public Result add(@Validated  @RequestBody MyArticle myArticle, BindingResult bindingResult) {
            try {
                if (bindingResult.hasErrors()) {
                    return new Result("400", "新发布文章失败!", bindingResult.getFieldError().getDefaultMessage(), "Bad Params", null);
                }
                boolean addResult = articleService.add(myArticle);
                if (addResult) {
                    return new Result("200", "新发布文章成功!", "", "", null);
                } else {
                    return new Result("200", "新发布文章失败!", "Oops, something weird", "10010", null);
                }
            } catch (Exception e) {
                return new Result("400", "新发布文章失败!", e.getMessage(), "Bad Params", null);
            }
        }
    

    一般情况下就结束了,但是等一下,你如果和我一样都是使用的高版本的Spring Boot,也就是2.3.x系列,那么以上增加的校验数据的注解会失效。这是由于高版本的Spring Boot需要单独手动安装Validate依赖包,在pom.xml文件中增加如下依赖:

    <dependency>
          <groupId>org.hibernate.validator</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>6.0.17.Final</version>
          <scope>compile</scope>
     </dependency>
    

    安装好之后,重启项目,一切搞定!
    解放生产力,从善用注解校验开始吧!

    本文将同步发布在公众号:成都有娃儿 欢迎关注,一起技术成长!

  • 相关阅读:
    DevExpress ASP.NET v19.1版本亮点:Pivot Grid等控件
    .NET界面控件DevExpress全新发布v19.1.5|改进Office 2019主题
    Kendo UI for jQuery使用教程:操作系统/jQuery支持等
    Web安全篇之SQL注入攻击
    SQL Server中timestamp(时间戳)和rowversion(版本戳)
    PyCharm2019 激活码
    性能测试 vs 负载测试 vs 压力测试
    一套完整的压力测试项目文档
    Visual Studio性能计数器,负载测试结果分析- Part III
    Visual Studio进行负载测试,RIG和负载测试术语- Part II
  • 原文地址:https://www.cnblogs.com/freephp/p/13623673.html
Copyright © 2011-2022 走看看