2015-04-01 68 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