时间:2021-05-19
@Valid:Hibernate validation校验机制
@Validated:Spring Validator校验机制,这个也是最常用的
@Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组、注解位置、嵌套验证等功能上有所不同
@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制,注解中必须提供groups属性,该属性就是做分组的必要参数
@Valid:没有分组功能
注解:
/** * 手机号验证正则 */@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)); }}以上示例未使用分组功能,因此每次都会校验。
使用分组校验示示例时,先要看看@Validated注解,因为分组校验就是配合该注解一起使用的,通过阅读注释就能理解到value属性就是用来指定分组的:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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 {};}因此我们需要改动的位置有两处:
作用类:
@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自定义注解验证手机格式内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Java自定义注解用法。分享给大家供大家参考,具体如下:一自定义注解语法[public]@interfaceAnnotation的名称{[数据类型
springmvc自定义注解以及自定义注解的解析一、自定义注解名字@Target({ElementType.TYPE,ElementType.METHOD})/
这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下自定义异常类步骤
java自定义类比较器示例:packagecom.myfile;importjava.util.ArrayList;importjava.util.Collec
java中自定义回调事件的写法创建interface类,创建interface对象,实现set方法:使用:kotlin中自定义点击事件写法依照java的思想(不