ConstraintValidator在包含lambda表达式

时间:2015-12-24 14:57:24

标签: java lambda annotations java-8 hibernate-validator

我试图在包含lambda表达式的类字段的输出上实现简单的数据验证。验证使用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;
        }

    }

}

具有待验证字段的类

import java.util.function.Supplier;

public class SampleClass {

    private SampleGenerator generator;

    @Mandatory
    public Supplier<String> lambdaField = () -> generator.next();

}

我的问题是上面的代码生成了一个编译错误,说明了这一点 “此数据类型不允许注释@Mandatory。”

如果我从自定义注释中删除“@ 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。

我也注意到以下警告: 警告:java:注释处理器'org.hibernate.validator.ap.ConstraintValidationProcessor'支持的源版本'RELEASE_6'小于-source'1.8'。
如果我切换到hibernate-validator-annotation-processor的5.2.2.Final版本但是仍然存在编译错误,则会删除此警告。

1 个答案:

答案 0 :(得分:2)

好吧,事实证明这是我设法提到这个日期的最愚蠢的错误之一。 主要搞砸:Test类中使用的供应商的类型为 java.util.function.Supplier ,而自定义验证器中使用的供应商的类型为 com.google.common。 base.Supplier ,因此显而易见的编译错误。第二个主要的搞砸是我在我的问题中没有包括完整的进口,认为他们会膨胀这个帖子。嗯,结果证明这是一个愚蠢的决定。

TLDR:搞砸了导入,使用了错误的类型,完全忽略了明确的编译错误,在stackoverflow上寻求帮助我的白痴。