SpringBoot数据校验与优雅处理详解( 三 )

@Validated和@Valid的不同参考:@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】

  • @Valid是标准JSR-303规范的标记型注解 , 用来标记验证属性和方法返回值 , 进行级联和递归校验 。
  • @Validated:是Spring提供的注解 , 是标准JSR-303的一个变种(补充) , 提供了一个分组功能 , 可以在入参验证时 , 根据不同的分组采用不同的验证机制 。
  • 在Controller中校验方法参数时 , 使用@Valid和@Validated并无特殊差异(若不需要分组校验的话) 。
  • @Validated注解可以用于类级别 , 用于支持Spring进行方法级别的参数校验 。 @Valid可以用在属性级别约束 , 用来表示级联校验 。
  • @Validated只能用在类、方法和参数上 , 而@Valid可用于方法、字段、构造器和参数上 。
如何自定义注解Jakarta Bean Validation API定义了一套标准约束注解 , 如@NotNull , @Size等 , 但是这些内置的约束注解难免会不能满足我们的需求 , 这时我们就可以自定义注解 , 创建自定义注解需要三步:
  1. 创建一个constraint annotation 。
  2. 实现一个validator 。
  3. 定义一个default error message 。
创建一个constraint annotation/** * 自定义注解 * @author Summerday */@Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE})@Retention(RUNTIME)@Constraint(validatedBy = CheckCaseValidator.class) //需要定义CheckCaseValidator@Documented@Repeatable(CheckCase.List.class)public @interface CheckCase {String message() default "{CheckCase.message}";Class[] groups() default {};Class[] payload() default {};CaseMode value();@Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})@Retention(RUNTIME)@Documented@interface List {CheckCase[] value();}}实现一个validator/** * 实现ConstraintValidator * * @author Summerday */public class CheckCaseValidator implements ConstraintValidator {private CaseMode caseMode;/*** 初始化获取注解中的值*/@Overridepublic void initialize(CheckCase constraintAnnotation) {this.caseMode = constraintAnnotation.value();}/*** 校验*/@Overridepublic boolean isValid(String object, ConstraintValidatorContext constraintContext) {if (object == null) {return true;}boolean isValid;if (caseMode == CaseMode.UPPER) {isValid = object.equals(object.toUpperCase());} else {isValid = object.equals(object.toLowerCase());}if (!isValid) {// 如果定义了message值,就用定义的,没有则去// ValidationMessages.properties中找CheckCase.message的值if(constraintContext.getDefaultConstraintMessageTemplate().isEmpty()){constraintContext.disableDefaultConstraintViolation();constraintContext.buildConstraintViolationWithTemplate("{CheckCase.message}").addConstraintViolation();}}return isValid;}}定义一个default error message在ValidationMessages.properties文件中定义:
CheckCase.message=Case mode must be {value}.这样 , 自定义的注解就完成了 , 如果感兴趣可以自行测试一下 , 在某个字段上加上注解:@CheckCase(value = http://kandian.youth.cn/index/CaseMode.UPPER) 。
源码下载本文内容均为对优秀博客及官方文档总结而得 , 原文地址均已在文中参考阅读处标注 。 最后 , 文中的代码样例已经全部上传至Gitee: , 另有其他SpringBoot的整合哦 。
作者:Summerday
原文链接:
如果觉得本文对你有帮助 , 可以转发关注支持一下