@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);
}
}