美文网首页
校验框架Hibernate Validator【原创】

校验框架Hibernate Validator【原创】

作者: 程序员不会写代码 | 来源:发表于2022-09-25 17:53 被阅读0次

    参考书籍《Hibernate Validator--JSR 303 的参考实现》

    为何要使用校验框架

    大部分后端开发都非常的苦恼,明明需求不怎么难,但是因为业务需求的限制,许多的参数都需要校验,比如校验用户输入的邮箱是否符合邮箱的格式,电话号是否符合某个号段,用户名是否没有包含特殊符号等等,可能逻辑代码就那么多但是controller层或者service的校验逻辑的写了几百行,验证影响了代码的可读性以及代码复用,甚至出现bug排查起来光看校验逻辑就要看半天,这是让开发非常头疼的事情,于是有了项目上的大佬们自己封装自己的校验工具类,但是有的项目频繁的换人,早成的情况是新来的压根就不知道前面的人已经造过轮子,导致代码里面非常的重复轮子,遇到这种事情莫慌,咋们在项目里面统一规定有用一个校验框架就完事了------Hibernate Validator 一个非常强大的校验框架的

    1. 校验入参对象中的某个属性不为空
    接口controller层代码
    
        public GetAndonDeviceResponse getAndonResponseDevice(@RequestBody @Validated GetAndonDeviceRequest request) {
      
        }
    
    请求对象中的属性
    public class GetAndonDeviceRequest extends PagedRequest {
        private String workerNumber;
        @NotEmpty(message = "ANDON_STATUS_NOT_EMPTY")
        private String status;
        private List<Long> andonClassIds;
    
    

    首先解释下@RequestBody这个注解不是校验框架的,加上这个注解的原因是因为你需要校验的属性在GetAndonDeviceRequest这个对象中,而前后端分离的项目前端传过来的就是json,这个注解表明的是去做返序列化,值得注意的是

    @RequestBody(required = false)
    

    这个注解中的requird默认等于true表明的是不管如何前端的body必须穿,不传就会造成反序列失败,而等于false表明的意思就是body中有值就反序列化,没有就不会做,因为我这里需要校验对象中的属性值,因此我这里强制要求前端必须传这个body给我,因为没有body反序列得到的request就是一个null里面啥都没有去做校验就做了

    我这就在controller的接口的如请请求参数中添加了来那个注解

    @RequestBody 和@Validated
    

    在需要校验的对象的属性上面添加了

    @NotEmpty(message = "ANDON_STATUS_NOT_EMPTY")
    

    notEmpt这个注解表明的是这个属性值不能等于空或者长度不能等于0
    message
    是当status不符合要求的时候就需要抛出的错误提示信息抛出的异常堆栈为MethodArgumentNotValidException这个错误
    在使用这些注解之前需要先在maven中添加依赖

     <dependency>
                 <groupId>org.hibernate</groupId>
                 <artifactId>hibernate-validator</artifactId>
                 <version>6.0.8.Final</version>
      </dependency>
    这里的版本可以自己去选择
    

    这个框架的校验的校验是在这个对象生成的时候进行校验的

    1. 对象图的校验
      所谓对象图就是对象里面的子对象的属性的校验
    public class InsertAndUpdateAndonBinRequestType extends BaseRequest {
        @Valid
        private List<AndonBinDTO> list;
    }
    
    
    
    public class AndonBinDTO {
        private String id;
        @NotEmpty(message = "bin_code_not_empty")
        private String andonBinCode;
    
    

    如果我需要校验InsertAndUpdateAndonBinRequestType中的AndonBinDTO中的andonBinCode是否符合要求,只需要在InsertAndUpdateAndonBinRequestType的list属性上加上一个@Valid注解,在需要校验的子对象的属性上加上对应的注解就可以了

    Hibernate Validator支持两种校验模式,第一种是快速失败模式,也是框架的默认模式,技术当遇到第一个需要校验的参数不符合要求就返回校验结果,第二种是返回所有的校验结果在抛出异常,抛出的异常是一个异常数组,这个需要配置,建议在使用过程中不要去配置,因为“默认大于配置”

    相关文章

      网友评论

          本文标题:校验框架Hibernate Validator【原创】

          本文链接:https://www.haomeiwen.com/subject/rbxvqctx.html