一、参数校验的实现
-
以前参数的校验大都通过编码的方式实现,如 Hutool 实现
StrUtil.isNotEmpty(arg); StrUtil.isNotNull(arg); StrUtil.isNotBlank(arg); ……
-
最近认识了新成员 @Validated 和 @Valid
关于两者的区别@Validated是org.springframework.validation.annotation.Validated,支持group分组
@Valid是javax.validation.Valid实际使用时,可以使用两者的嵌套
更多的高阶使用姿势,可参考:https://segmentfault.com/a/1190000022605819?utm_source=tag-newest
二、自定义一个 @Validated 参数注解
- 定义注解
package com.example.validated.validation; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @documented @Target({ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = IdentityCardNumberValidator.class) public @interface IdentityCardNumber { String message() default "身份证号码不合法"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; } - 注解校验实现
package com.example.validated.validation; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class IdentityCardNumberValidator implements ConstraintValidator
{ @Override public void initialize(IdentityCardNumber constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) { return check(o.toString()); } private boolean check(String arg) { // 具体的参数校验实现可以写在这儿 return true; } }
三、全局异常处理
作用:让校验生效,即参数校验时如果不合法就会抛出异常,我们就可以在全局异常中捕获拦截到,然后进行逻辑处理之后再返回
@RestControllerAdvice
public class MyGlobalExceptionHandler {
……
}



