当前位置: 首页 > 知识库问答 >
问题:

包含lambda表达式的字段上的ConstraintValidator出现问题

许正平
2023-03-14

我试图在包含lambda表达式的类字段的输出上实现一个简单的数据验证。验证是使用自定义注释和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-注释-处理器:4.1.0.Final

至于完整的编译器错误消息
Error:(5,5)java:此数据类型不允许注释@Mandative。

我还注意到以下警告:警告:java:annotation processor'org.hibernate.validator.ap中支持的源html" target="_blank">代码版本'RELEASE_6'。ConstraintValidationProcessor“小于-source“1.8”
如果切换到hibernate validator annotation processor的5.2.2.最终版本,则此警告将被删除,但编译错误仍然存在。

共有1个答案

胡鸿禧
2023-03-14

好吧,这是我迄今为止犯下的最愚蠢的错误之一。主要错误:测试类中使用的供应商类型为java.util.function。供应商,而自定义验证器中使用的供应商类型为com.google.common.base。供应商,因此存在明显的编译错误。第二个主要的错误是,我没有在我的问题中包括完整的进口产品,因为我认为它们会让帖子变得臃肿。事实证明,这是一个愚蠢的决定。

TLDR:搞乱了导入,使用了错误的类型,完全忽略了显式编译错误,继续向我在stackoverflow上的愚蠢行为寻求帮助。

 类似资料:
  • 问题内容: 最近,我发现匿名类和lambda表达式之间有细微的区别: 通常,lambda与匿名类等效。甚至我的Eclipse IDE都具有重构功能,可以将转换为lambda(变得完全像)并转换为匿名类(变得完全像)。但是lambda给了我一个编译错误,而匿名类却可以完美地编译。错误消息如下所示: 所以问题是:为什么会有这种差异? 问题答案: 这与处理前向引用的JLS#8.3.3有关。特别是,如果使

  • 我在Netbeans 8.0中的Lambda表达式有问题,我想知道是我做错了什么,还是Netbeans或javac编译器做错了。 我有以下代码: 然后我将其与: Netbeans给出以下消息: 那我就决定手动投了: 现在它警告我,演员阵容是多余的。 当我在Netbeans 8.0中用原始版本编译它时,它编译得很好,没有任何编译(或运行时)错误。现在到底是谁的错? 我会说那

  • 我发现正则表达式不包含101,如下所示: 0*1*0*(1 00 000)*(010)* 我无法理解作者是如何想出这个正则表达式的。所以我只想到了不包含101的字符串: 01000100 我似乎上面的字符串不会与上面的正则表达式匹配。但我不确定。所以尝试在regex101.com上翻译成等效的pcre正则表达式,但也失败了(因为可以看到我的正则表达式甚至不匹配包含单个1的字符串。 我的翻译有什么问

  • 我现在正在学习如何使用lambda表达式,我已经看到了一些带有简单示例的教程: 但是我的编译器显示这个错误: 我是不是忘了什么?

  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂

  • Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的