カスタムチェック
-
1)、编写一个自定义的校验注解
-
2)、编写一个自定义的校验器 ConstraintValidator
-
3)、关联自定义的校验器和自定义的校验注解
検証アノテーションの書き方については、JSR303の@NotBlankを参照できます。
彼には3つの属性があります。
//校验出错后,去此路径下去拿去错误信息,
String message() default "{javax.validation.constraints.NotBlank.message}";
//支持分组检验功能
Class<?>[] groups() default {
};
//负载信息
Class<? extends Payload>[] payload() default {
};
したがって、最初にこれら3つの情報をコピーする必要があります(独自の検証クラスと名付けますListValue
)。
もちろん、これらの5つのメモもコピーする必要があります。
@Documented
//该校验注解使用那个校验器进行校验
@Constraint(validatedBy = {
})
//此注解可以标注在哪些位置
@Target({
METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
//校验注解的时机
@Retention(RUNTIME)
//可重复注解可不要
@Repeatable(List.class)
ただし、これらのアノテーションはjavax.validationパッケージに含まれているため、最初にmavenに導入する必要があります。
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
3. JSR303はデフォルトでValidationMessages.propertiesファイルのエラー情報を取得するため、パスを変更する場合は、
自分で新しいValidationMessages.propertiesファイルを作成する必要があります。たとえば、私のListValueが書き込まれます。
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.RetentionPolicy.RUNTIME;
@Documented
@Constraint(validatedBy = {
ListValueConstraintValidator.class})
@Target({
METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.atguigu.common.valid.ListValue.message.message}";
Class<?>[] groups() default {
};
Class<? extends Payload>[] payload() default {
};
int[] vals() default {
};
}
次に、アノテーションの検証に使用するバリデーターを指定する必要があります。上記のように、validatedByの実装を確認できます。
つまり、配列を指定する必要があり、タイプはConstraintValidatorであり、次に、 ConstraintValidatorの実装、
ご覧のとおり、これは言い訳ですConstraintValidator <A extends Annotation、T>、最初に汎用アノテーションを指定し、2番目に汎用指定されたチェックでデータのタイプを確認するため、このメソッドを実装するためのチェックを作成するだけで済みます。インターフェイスは可能です!
less私のバリデーターは次のとおりです。
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
private Set<Integer> set = new HashSet<>();
@Override
public void initialize(ListValue constraintAnnotation) {
//拿到我们注解的Vals的值0,1,
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
//判断是否检验成功!
/**
*
* @param value 我们提交的值(需要校验的值
* @param context,上下文环境信息
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
この時点で、私のListValueは正常に使用できます。postManで
リクエストを送信すると、
showStatusは作成したValidationMessages.propertiesの情報と同じになります。もちろん、Messengeを使用してプロンプト情報を変更することもできます。