spring boot使用Validation做实体类数据验证

需要使用到的技术有:

Swagger-UI、Java、Bean Validation。

Swagger-UI需要引入包和配置,这里就不说它的配置了,网上面很多的。

关于使用如:@NotNull之类的Java注解时,找不到类的时候,需要引入的包:



    javax.validation
    validation-api
    1.1.0.Final

目录:

1、实体类注解

2、实体类验证分组(包含验证那些没有分组的)

3、组排序

4、验证多个对象

还有一些验证方法,需要更新,也希望大家提供,如:级联验证、对象内部对象验证,等等。

一、实体类的注解

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User2 {
    @ApiModelProperty(value = "密码4")
    @NotNull(message = "密码4不能为空")
    private String pawss4;

    @ApiModelProperty(value = "密码5")
    @NotNull(message = "密码5不能为空")//它属于import javax.validation.constraints.NotNull;
    private String pawss5;
}

//    @ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改,它属于swagger-ui
//    value–字段说明
//    name–重写属性名字
//    dataType–重写属性类型
//    required–是否必填
//    example–举例说明
//    hidden–隐藏

Java的注解还有:

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

controller的使用:

@PostMapping("/add")
public RspMessage add(@Validated User2 user,BindingResult result){
    List list = new ArrayList<>();
    for (FieldError error:result.getFieldErrors()){
        list.add(error.getDefaultMessage());
    }
    if (list != null && list.size() > 0){
        return new RspFailMessage(list);
     }
     return null;
 }

controller这里可以写一个全局异常,把BindingResult捕获住,就不用每个方法都写这个了,如:

package com.qw.exception;


import com.qw.utils.BindingResultUtil;
import com.qw.utils.RspFailMessage;
import com.qw.utils.RspMessage;
import org.springframework.validation.*;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常捕获处理
 */
@ResponseBody
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理 Validator 框架实体类验证的错误返回
     * @return
     */
    @ExceptionHandler({BindException.class})
    public RspMessage BindingResult(BindingResult result){
        return new RspFailMessage(BindingResultUtil.bindingResul(result));
    }
}


全局异常中的那个:BindingResultUtil.bindingResul 方法,和上面controller里面的方法一样的,只是把他单独抽取出来了而已,都是解析BindingResult对象的。

使用全局异常后,controller的写法就变成了:

@PostMapping("/add")
public RspMessage add(@Validated User2 user){
    return null;
}

swagger ui 显示如下:

spring boot使用Validation做实体类数据验证_第1张图片

二、实体类验证分组(包含没有分组的也要验证)

有时候,我们验证实体类时,不需要验证全部,比如新增时,需要id为空,修改时,需要id不为空,那么这里就需要分组验证了。

1、先新建两个接口(可以新建多个),专门用来区分新增和修改时需要验证的实体类属性。

package com.qw.model;

import javax.validation.groups.Default;

//用于新增的分组,这个可以单独写一个包,其他实体类应用。
//继承的 Default :需要验证没有分组的属性
public interface EntityAdd extends Default {
}


package com.qw.model;

import javax.validation.groups.Default;

//用于修改的分组,这个可以单独写一个包,其他实体类应用。
//继承的 Default :需要验证没有分组的属性
public interface EntityUpdate extends Default {
}

2、实体类

package com.qw.model;

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User2 {

    @NotNull(message = "不能为空",groups = {EntityUpdate.class})
    private Long id;

    @ApiModelProperty(value = "密码4")
    @NotNull(message = "密码4不能为空",groups = {EntityAdd.class,EntityUpdate.class})
    private String pawss4;

    @ApiModelProperty(value = "密码5")
    @NotNull(message = "密码5不能为空")
    private String pawss5;
}

上面的实体类中,id是在修改时,才进行验证,密码4在新增和修改时都需要验证,密码5 是不进行分组。

3、controller:

@PostMapping("/add")
    public RspMessage add(@Validated({EntityAdd.class}) User user){
        return null;
    }

三、组排序

Bean Validation 做验证时,是无序的,但在一个实体类中有多个组时,想要先验证一个组,在验证另一个组时,就需要进行组排序了。排序后:第一个组验证不通过,就不会验证下一个组了。

1、实体类

package com.qw.model;

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.GroupSequence;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User2 {

    @NotNull(message = "不能为空",groups = {EntityUpdate.class})
    private Long id;

    @ApiModelProperty(value = "密码4")
    @NotNull(message = "密码4不能为空",groups = {EntityAdd.class,EntityUpdate.class})
    private String pawss4;

    @ApiModelProperty(value = "密码5")
    @NotNull(message = "密码5不能为空")
    private String pawss5;


    //用于当前类中的属性验证顺序,先验证没有分组的,在验证新增的,这个也可以写成公共的,也可以写多个,根据实际业务需求来。
    @GroupSequence({Default.class,EntityAdd.class})
    public interface UserValidationSort{}
}

2、controller:

@PostMapping("/add")
    public RspMessage add(@Validated({User2.UserValidationSort.class}) User2 user){
        return null;
    }

四、多个对象验证

1、controller

@PostMapping("/update")
    public RspMessage update(@Validated({EntityUpdate.class}) User user, @Validated User2 user2){
        return null;
    }

直接把多个对象写上去就行了。

你可能感兴趣的:(Spring,Spring,MVC,javaBean技术)