JSf 2 с Hibernate Validator 4 и Tomcat 6
-
22-09-2019 - |
Вопрос
Проблема, с которой я столкнулся, заключается в том, что мой Проверка компонентов не работает так, как я ожидал.
У меня есть управляемый компонент с областью действия сеанса с name
поле, привязанное к h:inputText
.Имя должно быть введено и иметь минимальную длину 1 символ и максимальную длину 5 символов.Я ожидаю, что когда я введу имя в текстовое поле, оно будет соответствующим образом проверено поддерживающим компонентом, и если это не удастся, то отобразятся соответствующие сообщения об ошибках.
Однако, это не так. Валидации всегда терпят неудачу, даже если я введу допустимый регистр во входной текст (например,«абв»).При отладке приложения кажется, что getName()
Аксессор вызывается всегда, а установщик никогда не достигается.Я делаю что-то неправильно?Я предполагаю, что валидатор использует аксессор для проверки, но проблема в том, что установщик никогда не получает возможности обновить значение имени...Должно быть, я что-то упускаю.
Ниже приведен управляемый компонент:
@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>
Решение
Ваша проверка работает правильно.Проблема в ваших аннотациях @Min и @Max:
@NotNull
@Min(value = 1)
@Max(value = 5)
public String getName() {
return name;
}
@Min и @Max предназначены для числового сравнения.Вы написали:
Имя должно быть введено и иметь минимальную длину 1 символ и максимальную длину 5 символов.
Вместо этого вам следует использовать аннотацию @Size, например:
@NotNull
@Size(min = 1, max = 5)
public String getName() {
return name;
}
Поля компонента не обновляются, поскольку проверка не удалась.Только после успешной проверки компонент будет обновлен.
Другие советы
Что касается вашего дополнительного вопроса - увидеть эту матрицу - нет, они не совместимы.
Что касается вопроса JSF - проверьте как журналы tomcat, так и консоль javascript Firefox.
Чтобы вызвать ошибку компиляции в таком случае, мы можем использовать процессор аннотаций Hibernate Validator.валидатор спящего режима