SpringBoot数据校验与优雅处理详解( 三 )
@Validated和@Valid的不同参考:@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】
- @Valid是标准JSR-303规范的标记型注解 , 用来标记验证属性和方法返回值 , 进行级联和递归校验 。
- @Validated:是Spring提供的注解 , 是标准JSR-303的一个变种(补充) , 提供了一个分组功能 , 可以在入参验证时 , 根据不同的分组采用不同的验证机制 。
- 在Controller中校验方法参数时 , 使用@Valid和@Validated并无特殊差异(若不需要分组校验的话) 。
- @Validated注解可以用于类级别 , 用于支持Spring进行方法级别的参数校验 。 @Valid可以用在属性级别约束 , 用来表示级联校验 。
- @Validated只能用在类、方法和参数上 , 而@Valid可用于方法、字段、构造器和参数上 。
- 创建一个constraint annotation 。
- 实现一个validator 。
- 定义一个default error message 。
/** * 自定义注解 * @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 extends Payload>[] 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
原文链接:
如果觉得本文对你有帮助 , 可以转发关注支持一下
- 查询|数据太多容易搞混?掌握这几个Excel小技巧,办公思路更清晰
- 黑莓(BB.US)盘前涨逾32%,将与亚马逊开发智能汽车数据平台|美股异动 | US
- 健身房|乐刻韩伟:产业互联网中只做单环节很难让数据发挥大作用
- V2X|V2X:确保未来道路交通数据交换的安全性
- 短视频平台|大数据佐证,抖音带动三千万就业,视频手机将成生产力工具?
- 权属|从数据悖论到权属确认,数据共享进路所在
- 统计|多久才能换一次手机?统计机构数据有点意外
- 发展|大数据解读世界互联网大会·互联网发展论坛!
- 网购|黑色星期五及网购星期一大数据出炉 全球第三方卖家销售额超48亿美元
- Veeam|Veeam让企业数据拥有“第二次生命”