2015-04-01 108 views
1

我想从一个值上手动调用一个来自org.hibernate.validator.internal.constraintvalidators.的Validator,因为我无法注释这个类。我做了什么,这是:实现用于验证的Java注释

LengthValidator validator = new LengthValidator(); 
validator.initialize(new Length() { 
    @Override 
    public Class<? extends Annotation> annotationType() { 
     return null; 
    } 

    @Override 
    public Class<? extends Payload>[] payload() { 
     return null; 
    } 

    @Override 
    public int min() { 
     return min == null ? defaultMin : min; 
    } 

    @Override 
    public String message() { 
     return null; 
    } 

    @Override 
    public int max() { 
     return max == null ? defaultMax : max; 
    } 

    @Override 
    public Class<?>[] groups() { 
     return null; 
    } 
}); 
Boolean valid = validator.isValid(myValue.asText(), null)); 

但声纳不乐意:

lambda表达式和匿名类不应该有太多的行

于是,我就重构这个代码通过在这样的自定义类中实现@Length:

public class StringLength implements Length { 
    // All the methods overriden from @Length 
} 

但编译器com平原

注释类型长度不​​应被用作 StringLength

我怎样才能实现我想要做一个超接口?

回答

1

注意,使用内部类是不鼓励,但如果你真的愿意,你可以使用Hibernate验证AnnotationFactory

AnnotationDescriptor<Length> descriptor = new AnnotationDescriptor<Length>(Length.class); 
    descriptor.setValue("min", 0); 
    descriptor.setValue("max", 10); 
    ... 

    Length lengthAnnotation = AnnotationFactory.create(descriptor); 

我不太清楚,虽然,你获得使用LengthValidator什么。你仍然无法使用Validator框架,对吧?如果您不能注释该类,那么您是否可以不使用XML配置?

+0

事实上,我想验证无模式数据,我不想重写在Hibernate中完美工作的验证器。所以我不能使用XML配置,因为我不知道要验证的数据结构。这就是为什么我要构建注释并“动态”调用验证器的原因。我将尝试'AnnotationDescriptor';) – c4k 2015-04-07 10:55:25