说到jsr
我们就得先了解下什么是JCP(Java Community Process)
?
JCP(Java Community Process) 是一个开放的国际组织,主要由Java开发者以及被授权者组成,职能是发展和更新。
JSR
它是指向JCP提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,(如果你觉得自己牛逼你也可以提交一个) 以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
Bean Validation 顾名思义是对 java Bean 的校验,目前为止,Java 对 Bean 的校验有3个规范。
JSR-303 : Bean Validation
JSR 349 : Bean Validation 1.1
JSR 380 : Bean Validation 2.0
Hibernate Validator
是 Bean Validation
的参考实现 . Hibernate Validator
提供了 JSR 303
规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint
。
代码实现
如果项目的框架是 spring boot 的话,在 spring-boot-starter-web 中已经包含了 Hibernate-validator 的依赖(版本必须是2.3之前)。2.3
以后的版本 spring-boot-starter-web
已经去除了这个依赖,需要手动引入 Hibernate-validator
依赖,详细内容见官网描述
org.springframework.boot
spring-boot-starter-validation
非springboot
项目的话直接引入
org.hibernate
hibernate-validator
6.0.17.Final
代码演示:方法前面这个注解@Valid
是必须的,否则不生效哦。
@PostMapping(value = "/insert")
@ResponseBody
public Result insert(@Valid @RequestBody User user){
return Result.success();
}
实体类上标上需要校验的规则注解就好了。
//被注释的元素,值必须是一个字符串,不能为null,且调用trim()后,长度必须大于0
@NotBlank(message = "")
//被注释的元素,值不能为null,但可以为"空",用于基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 等对字段数值进行大小的控制
@NotNull(message = "")
//被注释的的元素,值不能为null,且长度必须大于0,一般用在集合类上面
@NotEmpty(message = "")
//被注释的元素必须符合指定的正则表达式。
@Pattern(regexp = "", message = "")
//被注释的元素的大小必须在指定的范围内。
@Size(min =, max =)
//被注释的元素,值必须是一个数字,且值必须大于等于指定的最小值
@Min(value = long以内的值, message = "")
//被注释的元素,值必须是一个数字,且值必须小于等于指定的最大值
@Max(value = long以内的值, message = "")
//被注释的元素,值必须是一个数字,其值必须大于等于指定的最小值
@DecimalMin(value = 可以是小数, message = "")
//被注释的元素,值必须是一个数字,其值必须小于等于指定的最大值
@DecimalMax(value = 可以是小数, message = "")
//被注释的元素,值必须为null
@Null(message = "")
//被注释的元素必须是一个数字,其值必须在可接受的范围内
@Digits(integer =, fraction =)
//被注释的元素,值必须为true
@AssertTrue(message = "")
//被注释的元素,值必须为false
@AssertFalse(message = "")
//被注释的元素必须是一个过去的日期
@Past(message = "")
//被注释的元素必须是一个将来的日期
@Future(message = "")
//被注释的元素必须是电子邮件地址
@Email(regexp = "", message = "")
//被注释的元素必须在合适的范围内
@Range(min =, max =, message = "")
//被注释的字符串的大小必须在指定的范围内
@Length(min =, max =, message = "")
如果是级联校验的话需要在最外层加上@Valid
为什么需要在校验的上一次标上@Valid
这个注解,里面的校验才会生效列
@RestControllerAdvice
public class GlobalControllerAdvice {
private static final String BAD_REQUEST_MSG = "客户端请求参数错误";
// <1> 处理 form data方式调用接口校验失败抛出的异常
@ExceptionHandler(BindException.class)
public ResultInfo bindExceptionHandler(BindException e) {
List fieldErrors = e.getBindingResult().getFieldErrors();
List collect = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.toList());
return new ResultInfo().success(HttpStatus.BAD_REQUEST.value(), BAD_REQUEST_MSG, collect);
}
// <2> 处理 json 请求体调用接口校验失败抛出的异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultInfo methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
List fieldErrors = e.getBindingResult().getFieldErrors();
List collect = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.toList());
return new ResultInfo().success(HttpStatus.BAD_REQUEST.value(), BAD_REQUEST_MSG, collect);
}
// <3> 处理单个参数校验失败抛出的异常
@ExceptionHandler(ConstraintViolationException.class)
public ResultInfo constraintViolationExceptionHandler(ConstraintViolationException e) {
Set> constraintViolations = e.getConstraintViolations();
List collect = constraintViolations.stream()
.map(o -> o.getMessage())
.collect(Collectors.toList());
return new ResultInfo().success(HttpStatus.BAD_REQUEST.value(), BAD_REQUEST_MSG, collect);
}
}