1、前提
在日常的开发中,服务端对象的校验是非常重要的一个环节,比如注册的时候:校验用户名,密码,身份证,邮箱等信息是否为空,以及格式是否正确。 但是这种在日常的开发中进行校验太繁琐了,代码繁琐而且很多。Validator框架应运而生,它的出现就是为了减少开发人员在开发时对数据校验的代码,提升开发效率。
Spring的validator校验框架遵守的是JSR-303的验证规范(参数校验规范),JSR全称:Java Specification Requests缩写。
2、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
3、常见的验证注解
JSR提供的校验注解:
注解名称 | 说明 |
---|
@Null(message) | 被注释的元素必须为 null | @NotNull(message) | 被注释的元素必须不为 null | @AssertTrue(message) | 被注释的元素必须为 true | @AssertFalse(message) | 被注释的元素必须为 false | @Min(value,message) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 | @Max(value,message) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 | @DecimalMin(value,message) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 | @DecimalMax(value,message) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 | @Size(max, min,message) | 被注释的元素的大小必须在指定的范围内 | @Digits (integer, fraction,message) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 | @Past(message) | 被注释的元素必须是一个过去的日期 | @Future(message) | 被注释的元素必须是一个将来的日期 | @Pattern(regex,flag,message) | 被注释的元素必须符合指定的正则表达式 |
Hibernate Validator提供的校验注解:
注解名称 | 说明 |
---|
@NotBlank(message ) | 验证字符串非null,且trim后长度必须大于0 | @Email(regexp,message) | 被注释的元素必须是电子邮箱地址 | @Length(min,max,message) | 被注释的字符串的大小必须在指定的范围内 | @NotEmpty(message) | 被注释的字符串的必须非空 | @Range(min,max,message) | 被注释的元素必须在合适的范围内 |
4、@Validated的使用
1、使用在Controller类上:当一些约束是直接出现在Controller层中的参数前时,只有将@Validated放在类上时,参数前的约束才会生效。
@RestController
@Validated
public class MessageController {
@GetMapping(value = "/validate")
public String validateTest(@Length(max = 10,min = 6,message = "长度错误") @RequestParam String name){
System.out.println(name);
return "成功";
}
}
2、使用在方法形参上: 当Controller层中参数是一个对象模型时,只有将@Validated直接放在该模型前,该模型内部的字段才会被校验(如果有对该模型的字段进行约束的话)。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
@NotNull
private String userName;
@NotNull
private int age;
@NotNull
@Length(min = 6,max = 10,message="长度不能小于六位且不能大于十位")
private String password;
}
@RestController
public class MessageController {
@GetMapping(value = "/validate")
public String validateTest(@Validated @RequestBody User user){
System.out.println(user.toString());
return "成功";
}
}
5、使用
@RestController
@Validated
public class MessageController {
@GetMapping(value = "/validate")
public String validateTest(@Length(max = 10,min = 6,message = "长度错误") @RequestParam String name){
System.out.println(name);
return "成功";
}
}
发起请求后的前端页面: 因为我给出的参数name的长度大于了10,所以触发了验证器,并且以错误的形式进行提示。
发起请求后的后端(IDEA控制台) 因为验证器触发,后台也以报错的形式提示。
6、自定义验证器异常处理器
因为触发了验证器,如果不符合验证器的规范就会报错,而使用默认的验证处理器的话,则是直接提示错误,这种方式对于普通的使用者来说就不是很友好。 所以,开发人员就需要自己定义验证器异常处理器。
异常处理器常见的三大异常
- ConstraintViolationException:不符合验证规则时触发
- BindException:使用form data方式调用接口,校验异常抛出 BindException
- MethodArgumentNotValidException:使用 json 请求体调用接口,校验异常会抛出此错误
相对于其他的错误,可以从控制台报错的情况中对该错误进行处理,同时也可以使用Exception对其他不想处理的错误进行处理。
当在异常处理器中同时使用了Exception和ConstraintViolationException时,如果验证器触发了ConstraintViolationException,就只会执行ConstraintViolationException所在的处理方法,而不会调用Exception处理方法,所以异常处理器会优先处理已经有所指明的异常,只有在异常处理器中没有对该异常进行声明的情况下才会执行Exception所在的异常处理方法。
异常处理类的两大注解
- @RestControllerAdvice:声明此类为异常处理类
- @ExceptionHandler:声明此方法处理什么异常
话不多说,上代码:
@RestControllerAdvice
public class ValidateExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public String exceptionHandler(ConstraintViolationException e){
System.out.println("拦截被触发" );
return "参数错误了";
}
@ExceptionHandler(Exception.class)
public String exceptionHandler(Exception e){
return "abc";
}
}
当发生了ConstraintViolationException异常时就会触发第一个方法,并且页面上会显示 ”参数错误了" ,所以@RestControllerAdvice会将方法的返回值以JSON的形式返回到前端页面。
|