springboot validation校验基本用法

常用的校验注解:
@Null  被注释的元素必须为null
@NotNull  被注释的元素不能为null
@AssertTrue  该字段只能为true
@AssertFalse  该字段的值只能为false
@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin("value")  被注释的元素必须是一个数字,验证小数的最小值
@DecimalMax("value")  被注释的元素必须是一个数字,验证小数的最大值
@Size(max,min)  查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
@Digits(integer,fraction) 检查是否是一种数字的整数、分数,小数位数的数字
@Past  被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个将来的日期
@Pattern(regexp = "[abc]") 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length(max=5,min=1,message="长度在1~5")    检查所属的字段的长度是否在min和max之间,只能用于字符串
@NotEmpty  被注释的字符串必须非空
@Range  被注释的元素必须在合适的范围内   
@CreditCardNumber 对信用卡号进行一个大致的验证
@NotBlank 不能为空,检查时会将空格忽略
@NotEmpty 不能为空,这里的空是指空字符串

封装返回值状态码枚举:

package com.example.validation.config;

import lombok.Getter;

@Getter
public enum ResultCode {
    SUCCESS(200, "请求成功"),
    FAILED(400, "请求失败"),
    VALIDATE_ERROR(410, "参数校验失败");

    private int code;
    private String msg;

    ResultCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

封装返回值实体:

package com.example.validation.config;

import lombok.Data;

@Data   //@Data相当于@Getter和@Setter
public class ResultVo {
    // 状态码
    private int code;

    // 状态信息
    private String msg;

    // 返回对象
    private Object data;

    // 手动设置返回vo
    public ResultVo(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 默认返回成功状态码,数据对象
    public ResultVo(Object data) {
        this.code = ResultCode.SUCCESS.getCode();
        this.msg = ResultCode.SUCCESS.getMsg();
        this.data = data;
    }

    // 返回指定状态码,数据对象
    public ResultVo(ResultCode statusCode, Object data) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
        this.data = data;
    }

    // 只返回状态码
    public ResultVo(ResultCode statusCode) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
        this.data = null;
    }

}

封装用户实体并添加校验:

package com.example.validation.entity;

import lombok.Data;
import lombok.ToString;

import javax.validation.constraints.*;

@ToString
@Data
public class User {
    @NotEmpty(message = "用户名不能为空")
    private String userName;

    @NotBlank(message = "密码不能为Null")
    private String password;

    @Max(value = 100, message = "年龄不能超过100")
    @Min(value = 1, message = "年龄不能小于1")
    private int age;
}

新建controller:

package com.example.validation.controller;

import com.example.validation.config.ResultCode;
import com.example.validation.config.ResultVo;
import com.example.validation.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequestMapping("/user")
public class Test {
    @GetMapping("/test001")
    public Object test001(@Valid User user, BindingResult bindingResult){  //这里用我试了试@Valid和@Validated都行
        if(bindingResult.hasErrors()){//获取校验失败信息
            return return new ResultVo(ResultCode.VALIDATE_ERROR, bindingResult.getFieldError().getDefaultMessage());
} return new ResultVo(ResultCode.SUCCESS, user); } }

每个请求都写一遍校验不太友好,添加统一校验:

package com.example.validation.config;

import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ControllerAdvice {
    @ExceptionHandler({BindException.class})
    public Object MethodArgumentValidException(BindException bindException) {
        // 从异常对象中拿到ObjectError对象
        String err = bindException.getFieldError().getDefaultMessage();
        return new ResultVo(ResultCode.VALIDATE_ERROR, err);

    }
}

之后controller就不用重复的获取校验失败信息了:

package com.example.validation.controller;

import com.example.validation.config.ResultCode;
import com.example.validation.config.ResultVo;
import com.example.validation.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequestMapping("/user")
public class Test {
    @GetMapping("/test002")
    public Object test002(@Valid User user){
        return new ResultVo(ResultCode.SUCCESS, user);
    }
}

 

posted @ 2023-02-11 13:58  曹伟666  阅读(359)  评论(0编辑  收藏  举报