java自定义注解验证手机格式的实现示例
1、@Valid与@Validated的区别
1.1 基本区别
@Valid:Hibernate validation校验机制
@Validated:Spring Validator校验机制,这个也是最常用的
@Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组、注解位置、嵌套验证等功能上有所不同
1.2 作用范围
@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
1.3 分组校验
@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制,注解中必须提供groups属性,该属性就是做分组的必要参数
@Valid:没有分组功能
2、未使用分组校验的示例
注解:
/** * 手机号验证正则 */ @Target({ElementType.FIELD,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {PhoneValidator.class})// 指定约束处理器,也就是手机号格式验证是哪个类来做校验 public @interface Phone { String pattern() default "^(?:(?:\\+|00)86)?1\\d{10}$"; String message() default "手机号格式非法"; Class<?>[] groups() default { }; // groups用来指定分组,可以让校验采取不同的机制,当前默认未指定任何分组机制,默认每次都要进行校验 Class<? extends Payload>[] payload() default { }; // 默认分组 interface Default{ } // 分组A interface A{ } }
格式校验处理器:
/** * 校验处理器:做手机号码格式验证的核心类 */ public class PhoneValidator implements ConstraintValidator<Phone, String> { // 注解对象 private Phone phone; // 初始化【Phone】对象 @Override public void initialize(Phone constraintAnnotation) { phone = constraintAnnotation; } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 获取【Phone】对象的手机格式验证表达式 String pattern = phone.pattern(); Pattern compile = Pattern.compile(pattern); Matcher matcher = compile.matcher(value); return matcher.matches(); }
作用类:
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class Person implements Serializable { @Phone private String phone; }
注意:只有在spring或者springboot项目中才能使用,直接调用方法不会有任何效果,使用注解进行对象的属性格式校验时,必须配合@Validated一起使用(不一起使用,格式校验注解将会无效),正确操作如下:
@RestController @RequestMapping("/admin/") public class PersonController { @Autowired private PersonService personService; @PostMapping("/query") public Person query(@RequestBody @Validated Person params) { return JsonResult.success(personService.queryByPhone(params)); } }
以上示例未使用分组功能,因此每次都会校验。
3、分组校验的示例
使用分组校验示示例时,先要看看@Validated注解,因为分组校验就是配合该注解一起使用的,通过阅读注释就能理解到value属性就是用来指定分组的:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Validated { /** * Specify one or more validation groups to apply to the validation step * kicked off by this annotation. * <p>JSR-303 defines validation groups as custom annotations which an application declares * for the sole purpose of using them as type-safe group arguments, as implemented in * {@link org.springframework.validation.beanvalidation.SpringValidatorAdapter}. * <p>Other {@link org.springframework.validation.SmartValidator} implementations may * support class arguments in other ways as well. */ Class<?>[] value() default {}; }
因此我们需要改动的位置有两处:
- 首先是注解的作用类,注解上指定groups属性
- 其次是controller中的请求的形参:在请求中形参的@Validated指定value值,也就是指定校验生效的分组,如果请求中的分组类型【@Validated的value值】和作用类中注解所指定的分组【@Phone中的groups属性的值】一致时,才会进行校验,否则不会执行校验
作用类:
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class Person implements Serializable { // 指定groups属性 @Phone(groups = {Phone.A.class}) private String phone; }
controller层:
@RestController @RequestMapping("/admin/") public class PersonController { @Autowired private PersonService personService; @PostMapping("/query") public Person query(@RequestBody @Validated(Phone.A.class) Person params) { return JsonResult.success(personService.queryByPhone(params)); } }
此时请求中的校验分组Phone.A.class和作用类中的校验分组Phone.A.class一致,所以校验会被执行
到此这篇关于java自定义注解验证手机格式的实现示例的文章就介绍到这了,更多相关java自定义注解验证手机格式内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31Django def clean()函数对表单中的数据进行验证操作
这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要为大家详细介绍了JavaScript实现密码框输入验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20- 这篇文章主要介绍了Nest.js 授权验证的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
- 这篇文章主要介绍了el-table树形表格表单验证(列表生成序号),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01