我试图在包含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.最终版本,则此警告将被删除,但编译错误仍然存在。
好吧,这是我迄今为止犯下的最愚蠢的错误之一。主要错误:测试类中使用的供应商类型为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 - 无需声明参数类型。 编译器可以从参数的值推断出相同的