1,編寫一個自定義校驗註解ListValue
package com.atguigu.common.valid; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @Description: 自定義校驗註解 * @Author: zyn * @Date: 2021-7-2 */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {ListValueConstraintValidator.class })//指定自定義校驗器 public @interface ListValue { String message() default "{com.atguigu.common.valid.ListVal.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; int[] vals(); }
建ValidationMessages.proerties文件,配置ListValue中的指定的message
com.atguigu.common.valid.ListVal.message=必須提交指定的值
此處有個坑,坑了我一個多小時,.proerties屬性值取出來一直亂碼,最後看了@一篇文章給了思路,刪除重建好了(並沒有像文中那樣單獨指定properties文件編碼)
2,編寫一個自定義校驗器
判斷校驗是否成功
package com.atguigu.common.valid; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.HashSet; import java.util.Set; /** * @Description: 自定義校驗註解. * @Author: zyn * @Date: 2021-7-2 */ //ConstraintValidator 接收兩個 public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> { private Set<Integer> set=new HashSet<>(); //初始化方法 @Override public void initialize(ListValue constraintAnnotation) { int [] vals=constraintAnnotation.vals();//校驗註解標註的指定的值 for (int val : vals) { set.add(val); } } //判斷是否校驗成功 /** * @Description: * @Author: zyn * @Date: 2021-7-5 * @param value 標註校驗註解屬性的傳過來的值,需要校驗的值 */ @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { return set.contains(value); } }
3,關聯自定義校驗器和自定義校驗註解
主要是校驗註解中Constraint validatedBy指定自定義校驗器,在步驟1代碼中已呈現
實體類需要校驗的字段標註步驟1的自定義校驗註解
@ListValue(vals={0,1},groups = AddGroup.class) private Integer showStatus;