考虑一个基本的Java程序,其目标是创建一个自定义参数验证注释。
此代码的大多数其他示例都关注它在Spring或Hibernate中的用法,但是这在普通的Java程序中是否可行?下面的示例代码根本不会调用自定义注释。 MinLengthValidator
内的断点不会被击中。
javax.validation:validation-api:1.1.0.Final jar在类路径上,就像org.hibernate:hibernate-validator:5.2.1.Final FWIW,但我认为这只是必要的使用内置的bean验证注释,而不是自定义注释。
在Eclipse中,我已经通过Java编译器设置启用了注释处理,并且包含了一个实现AbstractProcessor
的类,标有@SupportedAnnotationTypes("com.example.MinLength")
,但其process
方法没有&#39}。似乎也被调用了。
还需要什么?编译器标志,JVM选项?在"普通香草"中是否存在使用验证注释API的规范参考? Java项目?
=====
public static void main(String[] args) {
printLongMessage("hello today is Wednesday");
}
public static void printLongMessage(@MinLength(5) String message) {
System.out.println(message);
}
@MinLength
验证由以下两个类提供:
MinLength.java:
package com.example;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target( { PARAMETER, ANNOTATION_TYPE } )
@Retention(RUNTIME)
@Constraint(validatedBy = MinLengthValidator.class)
public @interface MinLength {
String message() default "String is shorter than allowed minimum length.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int value();
}
MinLengthValidator.java:
package com.example;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MinLengthValidator implements ConstraintValidator<MinLength, String> {
private int minLength;
@Override
public void initialize(MinLength constraintAnnotation) {
minLength = constraintAnnotation.value();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value.length() >= minLength;
}
}