2010-02-24 1 views
2

Проблема, с которой я столкнулся, заключается в том, что мой 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> 
+0

Другим связанным вопросом является совместимость этой комбинации Hibernate Entity Manager и Hibernate Validator. – jamiebarrow

+0

И я еще не пробовал это на Glassfish, иногда возникают различия между Tomcat и Glassfish (например, ValueChangeEvent.getNewValue() возвращает String на Tomcat, тогда как он представляет Integer и возвращает Integer на Glassfish). Может быть, стоит того, посмотрю, когда вернусь к этому. – jamiebarrow

+0

У меня такая же проблема с валидатором Hibernate 4.0.2 + Mojarra 2.0.2 на Jetty. Вы нашли причину этого? –

ответ

2

Ваша валидация работает правильно. Проблема с вашим @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; 
} 

Боковые поля не обновляются, поскольку проверка не выполняется. Только после успешной проверки будет обновлен компонент.

+0

Спасибо Tuukka, это имеет смысл. Все еще не вернулись к этому еще, перешли к различным проектам, надеюсь, попробуют это в свободное время. – jamiebarrow

+0

Кажется, это популярный вопрос. Я отдам вам ответ, хотя еще не пробовал решение – jamiebarrow

0

Что касается Вашего дополнительного вопроса - see this matrix - нет, они не совместимы.

О вопросе JSF - проверьте как журналы tomcat, так и консоль javascript firefox.

+0

Я не думаю, что это имеет какое-то отношение к Javascript, хотя сообщение успешно дошло до сервера ... любые проблемы, с которыми вы столкнулись в соответствии с этим? Это не исключение, поэтому он не будет отображаться в журналах Tomcat, о которых я думаю, но отметил. Я не помню ничего необычного в журналах, но я снова проверю их, когда вернусь к этому. Спасибо за ссылку, я был там раньше, но никогда не просканировал достаточно далеко, предполагая, что последние выпуски будут совместимы: B Хотя, я действительно пробовал это с помощью 3.1.0 GA, но не повезло, если я помню правильно. – jamiebarrow

+0

также уменьшают порог регистрации вашего регистратора. – Bozho

+0

Но что, если я хочу вести журнал для отладки, это то, что нужно для ведения журнала: D, уменьшающий его до WARN, помогает, но он все еще очень медленный. На данный момент я не слишком обеспокоен, так как если проблема возникнет, я все равно присоединяю отладчик или увеличиваю его до TRACE и использую Tomcat вне любой IDE (бит боли, но эй) – jamiebarrow

0

Чтобы поднять ошибку компиляции в этом случае, мы можем использовать обработчик аннотации Hibernate Validator. hibernate validator

 Смежные вопросы

  • Нет связанных вопросов^_^