Проблема, с которой я столкнулся, заключается в том, что мой Bean Validation не работает, как я ожидал бы.JSf 2 с Hibernate Validator 4 и Tomcat 6
У меня есть обработанный сеансом управляемый компонент с полем name
, который связан с h:inputText
. Имя должно быть введено и иметь минимальную длину 1 символ и максимальную длину 5 символов. Я ожидаю, что когда я введу имя в текстовое поле, оно будет подтверждено соответствующим компонентом бэкэнда, и если он не удастся, тогда он отобразит соответствующие сообщения об ошибках.
Однако, это не тот случай. Валидации всегда сбой, даже если я введу действующий регистр в inputText (например, «abc»). При отладке приложения кажется, что всегда нужен аксессуар getName()
, а сеттер никогда не был достигнут. Я делаю что-то неправильно? Я предполагаю, что валидатор использует аксессуар для проверки, но проблема в том, что у сеттера никогда не будет возможности обновить значение имени ... Я должен что-то упустить.
Ниже Managed Bean:
@ManagedBean
@SessionScoped
public class James implements Serializable {
public James() {
super();
}
private String name;
@NotNull
@Min(value = 1)
@Max(value = 5)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Ниже приведен фрагмент XHTML JSF. Я попробовал несколько различных вариаций с отдельными формами, но первым вариантом является тот, который я предполагаю работать (я думаю, что это эквивалентно тому, третий вариант, но старался на всякий случай :))
<h:messages/>
<h:form>
<h:inputText id="jamesName" value="#{james.name}"/>
<h:message for="jamesName"/>
<h:commandButton value="submit"/>
</h:form>
<h:form>
<h:inputText id="jamesName" value="#{james.name}" immediate="true"/>
<h:message for="jamesName"/>
<h:commandButton value="submit"/>
</h:form>
<h:form>
<h:inputText id="jamesName" value="#{james.name}">
<f:validateBean />
</h:inputText>
<h:message for="jamesName"/>
<h:commandButton value="submit"/>
</h:form>
Я используя JSF 2.0.2-FCS с Hibernate Entity Manager 3.3.2.GA и Hibernate Validator 4.0.2.GA (ниже приведены соответствующие части моего Maven POM), работающие в Tomcat 6.0.20 на Windows XP Pro с пакетом обновления 3 (32-бит).
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.2-FCS</version>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.2-FCS</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.2.GA</version>
</dependency>
Другим связанным вопросом является совместимость этой комбинации Hibernate Entity Manager и Hibernate Validator. – jamiebarrow
И я еще не пробовал это на Glassfish, иногда возникают различия между Tomcat и Glassfish (например, ValueChangeEvent.getNewValue() возвращает String на Tomcat, тогда как он представляет Integer и возвращает Integer на Glassfish). Может быть, стоит того, посмотрю, когда вернусь к этому. – jamiebarrow
У меня такая же проблема с валидатором Hibernate 4.0.2 + Mojarra 2.0.2 на Jetty. Вы нашли причину этого? –