在包含 lambda 表达式的字段上使用 ConstraintValidator 问题
Issue with ConstraintValidator on a field that contains a lambda expression
我正在尝试对包含 lambda 表达式的 class 字段的输出实现简单的数据验证。验证是使用 a custom annotation and ConstraintValidator 完成的,如下所示:
自定义注释:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MandatoryValidation.class)
public @interface Mandatory {
boolean value() default true;
String message() default "A value must be supplied";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
自定义验证器:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.google.common.base.Supplier;
public class MandatoryValidation implements ConstraintValidator<Mandatory, Supplier<String>> {
private boolean mandatory;
@Override
public void initialize(Mandatory mandatory) {
this.mandatory = mandatory.value();
}
@Override
public boolean isValid(Supplier<String> supplier, ConstraintValidatorContext constraintValidatorContext) {
if (mandatory && supplier.get() == null) {
return false;
} else {
return true;
}
}
}
Class 需要验证的字段
import java.util.function.Supplier;
public class SampleClass {
private SampleGenerator generator;
@Mandatory
public Supplier<String> lambdaField = () -> generator.next();
}
我的问题是上面的代码生成了一个编译错误,指出
"The annotation @Mandatory is disallowed for this data type."
如果我从我的自定义注释中删除 "@Constraint(validatedBy = MandatoryValidation.class)" 行,错误就会消失,这让我认为我确实搞砸了在自定义验证器的某个地方,但我不知道如何修复它。
任何人都可以告诉我上面的代码有什么问题吗?
编辑:
我正在使用以下配置:
Jdk : jdk1.8.0_65
javax.validation-api : 1.1.0.Final
hibernate-validator-annotation-processor : 4.1.0.Final
至于完整的编译器错误信息:
错误:(5, 5) java: 注释@Mandatory 对于这种数据类型是不允许的。
我还注意到以下警告:
Warning:java:注释处理器 'org.hibernate.validator.ap.ConstraintValidationProcessor' 支持的源版本 'RELEASE_6' 小于 -source '1.8'。
如果我切换到 5.2.2.Final 版本的 hibernate-validator-annotation-processor 但编译错误仍然存在,则此警告将被删除。
好吧,这是迄今为止我设法纠正的最愚蠢的错误之一。
主要错误:测试 class 中使用的供应商类型为 java.util.function.Supplier,而自定义验证器中使用的供应商类型为 com.google.common.base.Supplier,因此出现明显的编译错误。第二个主要错误是我没有在我的问题中包含完整的导入,认为它们会使 post 膨胀。好吧,结果证明这是一个愚蠢的决定。
TLDR: 搞砸了导入,使用了错误的类型,完全忽略了显式编译错误,在 Whosebug 上寻求帮助以解决我的白痴问题。
我正在尝试对包含 lambda 表达式的 class 字段的输出实现简单的数据验证。验证是使用 a custom annotation and ConstraintValidator 完成的,如下所示:
自定义注释:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MandatoryValidation.class)
public @interface Mandatory {
boolean value() default true;
String message() default "A value must be supplied";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
自定义验证器:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.google.common.base.Supplier;
public class MandatoryValidation implements ConstraintValidator<Mandatory, Supplier<String>> {
private boolean mandatory;
@Override
public void initialize(Mandatory mandatory) {
this.mandatory = mandatory.value();
}
@Override
public boolean isValid(Supplier<String> supplier, ConstraintValidatorContext constraintValidatorContext) {
if (mandatory && supplier.get() == null) {
return false;
} else {
return true;
}
}
}
Class 需要验证的字段
import java.util.function.Supplier;
public class SampleClass {
private SampleGenerator generator;
@Mandatory
public Supplier<String> lambdaField = () -> generator.next();
}
我的问题是上面的代码生成了一个编译错误,指出 "The annotation @Mandatory is disallowed for this data type."
如果我从我的自定义注释中删除 "@Constraint(validatedBy = MandatoryValidation.class)" 行,错误就会消失,这让我认为我确实搞砸了在自定义验证器的某个地方,但我不知道如何修复它。
任何人都可以告诉我上面的代码有什么问题吗?
编辑:
我正在使用以下配置:
Jdk : jdk1.8.0_65
javax.validation-api : 1.1.0.Final
hibernate-validator-annotation-processor : 4.1.0.Final
至于完整的编译器错误信息:
错误:(5, 5) java: 注释@Mandatory 对于这种数据类型是不允许的。
我还注意到以下警告:
Warning:java:注释处理器 'org.hibernate.validator.ap.ConstraintValidationProcessor' 支持的源版本 'RELEASE_6' 小于 -source '1.8'。
如果我切换到 5.2.2.Final 版本的 hibernate-validator-annotation-processor 但编译错误仍然存在,则此警告将被删除。
好吧,这是迄今为止我设法纠正的最愚蠢的错误之一。 主要错误:测试 class 中使用的供应商类型为 java.util.function.Supplier,而自定义验证器中使用的供应商类型为 com.google.common.base.Supplier,因此出现明显的编译错误。第二个主要错误是我没有在我的问题中包含完整的导入,认为它们会使 post 膨胀。好吧,结果证明这是一个愚蠢的决定。
TLDR: 搞砸了导入,使用了错误的类型,完全忽略了显式编译错误,在 Whosebug 上寻求帮助以解决我的白痴问题。