Я хочу вызвать Validator из org.hibernate.validator.internal.constraintvalidators.
вручную по значению, потому что я не могу аннотировать класс. Я сделал следующее:
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));
Но Сонар не доволен:
У Lambdas и анонимных классов не должно быть слишком много строк
Поэтому я попытался реорганизовать этот код, выполнив @Length в пользовательском классе следующим образом:
public class StringLength implements Length {
// All the methods overriden from @Length
}
но компилятор жалуется
Длина аннотации Length не должна использоваться в качестве суперинтерфейса для StringLength
Как я могу достичь того, что хочу?
Обратите внимание, что использование внутренних классов не рекомендуется, но если вы действительно этого захотите, вы можете использовать Hibernate Validator 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-конфигурацию?
AnnotationDescriptor
;)