2015-01-15 1 views
1

У меня есть веб-приложение JSF-2.2 на сервер приложений Шипин в WildFly 8,1 Hibernate-валидатор 5.1Hibernate валидатор программные ограничения декларации и JSF

Я хочу установить некоторые constrainst programmaticaly с помощью текучего API, потому что зависит от случай, например, минимальное и максимальное из @Size ограничения могут изменяться или поле может быть @NotNull или нет ...

поэтому я стараюсь programmaticaly настроить ограничения, такие, как описывают здесь: http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html_single/#section-programmatic-api

я Somthing например, попробовать (в EJB @Singleton @Startup):

HibernateValidatorConfiguration configuration = Validation 
    .byProvider(HibernateValidator.class) 
    .configure(); 

ConstraintMapping constraintMapping = configuration.createConstraintMapping(); 

constraintMapping 
.type(Car.class) 
    .property("manufacturer", FIELD) 
     .constraint(new NotNullDef()) 
    .property("licensePlate", FIELD) 
     .ignoreAnnotations() 
     .constraint(new NotNullDef()) 
     .constraint(new SizeDef().min(2).max(14)); 

Validator validator = configuration.addMapping(constraintMapping) 
    .buildValidatorFactory() 
    .getValidator(); 

Но тогда JSF не использует это новое сопоставление ограничений.

Я могу представить формы без проблем, даже если я нарушу ограничение programmaticaly набора

Я не знаю, как настроить валидатор или ValidatorFactory JSF использует или как обеспечить, чтобы JSF в другом валидатор или ValidatorFactory .. .

или может быть это больше о настройке сервера WildFly, что-то делать в конфигурационном файле или JNDI, я понятия не имею ...


EDIT

Я пытаюсь связать новый валидатор и валидатор завод в JNDI Но я не могу, потому что «контекст именования только для чтения»

 Hashtable jndiProperties = new Hashtable(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     Context context = new InitialContext(jndiProperties); 
     context.bind("java:comp/Validator", factory.getValidator()); 
     context.bind("java:comp/ValidatorFactory", factory); 

Спасибо Hardy

Как вы предложили мне создать Улучшение валидатора Hibenate https://hibernate.atlassian.net/browse/HV-955

ответ

2

Невозможно сделать то, что вам нужно. Hibernate Validator действительно имеет программное сопоставление, но это особенность Hibernate Validator. Невозможно запустить эту функцию в режиме проверки бина. Я говорю это, поскольку единственный способ настроить ваш ValidatorFactory и, следовательно, экземпляр Validator в контейнере - через validation.xml. И нет никакого механизма для свободного API в этом файле конфигурации.

Ваша идея JNDI в принципе хорошая, но, как вы говорите, она доступна только для чтения.

validation.xml допускает специфические свойства поставщика. Можно представить себе такую ​​недвижимость, как org.hibernate.validator.config_factory=acme.MyConfig. Значение свойства будет указывать на полностью определенный класс, который будет содержать какой-то заводский метод, который возвращает программное сопоставление для добавления в конфигурацию. К сожалению, такого свойства еще не существует. Вы могли бы открыть вопрос here, хотя ;-)