Validated校验在springboot框架中的应用(教程版)

前言

b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的。
Spring3支持JSR-303验证框架,JSR-303 是Java EE 6中的一项子规范,叫做BeanValidation,官方参考实现是hibernate Validator(与Hibernate ORM没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。
spring-boot中在Controller层里面可以用@validated注解来校验数据再进入业务逻辑层,如果数据异常则会统一抛出异常,方便异常中心统一处理。
比如,我们判断一个输入的用户名长度限制以及密码的正则验证.

使用教程

1.添加依赖
		<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.16.Final</version>
        </dependency>
2.Controller层数据使用@validated注解(表示开启,需要根据自己的业务在对应的方法参数上添加)
@PostMapping("/userLogin")
@ResponseBody
public TResult login(@RequestBody(required=true) @Validated User user) {
    return  accountServiceInter.login(user);
  }
}
3.然后在实体上声明需要被校验的字段(需要根据自己的业务添加,具体注解在6)
@Pattern(regexp = "^[a-zA-Z0-9_]{4,16}$", message = "用户名必需4-16位")
	private String username;
	//用户密码
	@Pattern(regexp ="^[a-zA-Z0-9_]{6,16}$", message = "用户名必需6-16位")
	private String password;
4.全部异常捕获

4.1网上业务处理

 /**
     * 处理所有接口数据验证异常
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public TResult handleValidException(MethodArgumentNotValidException  e) {
        logger.error("程序验证错误",e);
        TResult tResult = TResultEncap.setErrResult(ReturnCodeBase.ERR6000);
        tResult.setErrMsg(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return tResult;
    }

4.2系统业务处理

   /**
     * Validated注解校验异常
     * mdw
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
     public Object methodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        if (StringUtils.isNotEmpty(bindingResult.getAllErrors())) {
            String defaultMessage = bindingResult.getAllErrors().get(0).getDefaultMessage();
            return ApiResult.fail(defaultMessage);
        }
        return ApiResult.fail("服务器错误,请联系管理员");
    }

当输入不能满足条件是,就会抛出异常,而后统一由异常中心处理,推荐这种方式

5.嵌套校验(特殊情况内嵌套的,关联查询的,需要如下操作)

如果一个类中包含了另外一个实体类,那么在上面加上@Validated即可,比如下面的

 public class Student{    
    @validated
    private List< User>studentList;
 }
6.常用注解类型(文字版,根据业务需要添加,多注解添加同时生效)
限制	说明
@Null	限制只能为null
@NotNull	限制必须不为null
@AssertFalse	限制必须为false
@AssertTrue	限制必须为true
@DecimalMax(value)	限制必须为一个不大于指定值的数字
@DecimalMin(value)	限制必须为一个不小于指定值的数字
@Digits(integer,fraction)	限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future	限制必须是一个将来的日期
@Max(value)	限制必须为一个不大于指定值的数字
@Min(value)	限制必须为一个不小于指定值的数字
@Past	限制必须是一个过去的日期
@Pattern(value)	限制必须符合指定的正则表达式
@Size(max,min)	限制字符长度必须在min到max之间
@Past	验证注解的元素值(日期类型)比当前时间早
@NotEmpty	验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank	验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email	验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

优缺点

优点: 统一接口校验方法,并且可以指定相应的异常信息,避免手动写if else判断参数是否合法
缺点:在公用一个打开校验的接口时,校验有问题.需要在使用的时候考虑

注意事项

  1. 修改时如果不传此校验的参数会报错,所以修改时也应该传全参。
  2. 使用时需在接口参数前添加注解开启此校验。
  3. 使用注解时应抛出异常信息。默认的异常信息是英文。
  4. 建议大家使用的时候先结合大家的业务使用.

写在最后

本人正在更新: 基于SpringBoot+POI实现的excel导入导出(适配版)
欢迎大家阅读和探讨.有问题可以随时私信我,谢谢大家.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值