java自定義注解驗(yàn)證手機(jī)格式的實(shí)現(xiàn)示例
1、@Valid與@Validated的區(qū)別
1.1 基本區(qū)別
@Valid:Hibernate validation校驗(yàn)機(jī)制
@Validated:Spring Validator校驗(yàn)機(jī)制,這個(gè)也是最常用的
@Validation只是對(duì)@Valid進(jìn)行了二次封裝,在使用上并沒(méi)有太大區(qū)別,但在分組、注解位置、嵌套驗(yàn)證等功能上有所不同
1.2 作用范圍
@Validated:用在類型、方法和方法參數(shù)上。但不能用于成員屬性(field)
@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(field)上
1.3 分組校驗(yàn)
@Validated:提供分組功能,可以在參數(shù)驗(yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制,注解中必須提供groups屬性,該屬性就是做分組的必要參數(shù)
@Valid:沒(méi)有分組功能
2、未使用分組校驗(yàn)的示例
注解:
/** * 手機(jī)號(hào)驗(yàn)證正則 */ @Target({ElementType.FIELD,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {PhoneValidator.class})// 指定約束處理器,也就是手機(jī)號(hào)格式驗(yàn)證是哪個(gè)類來(lái)做校驗(yàn) public @interface Phone { String pattern() default "^(?:(?:\\+|00)86)?1\\d{10}$"; String message() default "手機(jī)號(hào)格式非法"; Class<?>[] groups() default { }; // groups用來(lái)指定分組,可以讓校驗(yàn)采取不同的機(jī)制,當(dāng)前默認(rèn)未指定任何分組機(jī)制,默認(rèn)每次都要進(jìn)行校驗(yàn) Class<? extends Payload>[] payload() default { }; // 默認(rèn)分組 interface Default{ } // 分組A interface A{ } }
格式校驗(yàn)處理器:
/** * 校驗(yàn)處理器:做手機(jī)號(hào)碼格式驗(yàn)證的核心類 */ public class PhoneValidator implements ConstraintValidator<Phone, String> { // 注解對(duì)象 private Phone phone; // 初始化【Phone】對(duì)象 @Override public void initialize(Phone constraintAnnotation) { phone = constraintAnnotation; } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 獲取【Phone】對(duì)象的手機(jī)格式驗(yàn)證表達(dá)式 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項(xiàng)目中才能使用,直接調(diào)用方法不會(huì)有任何效果,使用注解進(jìn)行對(duì)象的屬性格式校驗(yàn)時(shí),必須配合@Validated一起使用(不一起使用,格式校驗(yàn)注解將會(huì)無(wú)效),正確操作如下:
@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)); } }
以上示例未使用分組功能,因此每次都會(huì)校驗(yàn)。
3、分組校驗(yàn)的示例
使用分組校驗(yàn)示示例時(shí),先要看看@Validated注解,因?yàn)榉纸M校驗(yàn)就是配合該注解一起使用的,通過(guò)閱讀注釋就能理解到value屬性就是用來(lái)指定分組的:
@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 {}; }
因此我們需要改動(dòng)的位置有兩處:
- 首先是注解的作用類,注解上指定groups屬性
- 其次是controller中的請(qǐng)求的形參:在請(qǐng)求中形參的@Validated指定value值,也就是指定校驗(yàn)生效的分組,如果請(qǐng)求中的分組類型【@Validated的value值】和作用類中注解所指定的分組【@Phone中的groups屬性的值】一致時(shí),才會(huì)進(jìn)行校驗(yàn),否則不會(huì)執(zhí)行校驗(yàn)
作用類:
@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)); } }
此時(shí)請(qǐng)求中的校驗(yàn)分組Phone.A.class和作用類中的校驗(yàn)分組Phone.A.class一致,所以校驗(yàn)會(huì)被執(zhí)行
到此這篇關(guān)于java自定義注解驗(yàn)證手機(jī)格式的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java自定義注解驗(yàn)證手機(jī)格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MybatisPlus中@TableField注解的使用詳解
這篇文章主要介紹了MybatisPlus中@TableField注解的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringMVC中的ConversionServiceExposingInterceptor工具類解析
這篇文章主要介紹了SpringMVC中的ConversionServiceExposingInterceptor工具類解析,ConversionServiceExposingInterceptor是Spring MVC的一個(gè)HandlerInterceptor,用于向請(qǐng)求添加一個(gè)屬性,需要的朋友可以參考下2023-12-12Spring Boot實(shí)現(xiàn)qq郵箱驗(yàn)證碼注冊(cè)和登錄驗(yàn)證功能
這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)qq郵箱驗(yàn)證碼注冊(cè)和登錄驗(yàn)證功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringBoot+JUnit5+MockMvc+Mockito單元測(cè)試的實(shí)現(xiàn)
今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應(yīng)用最廣的測(cè)試框架,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Spring?ComponentScan的掃描過(guò)程解析
這篇文章主要介紹了spring?ComponentScan的掃描過(guò)程解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03java實(shí)現(xiàn)微信小程序加密數(shù)據(jù)解密算法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信小程序加密數(shù)據(jù)解密算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09