JSf 2 с Hibernate Validator 4 и Tomcat 6 - PullRequest
       21

JSf 2 с Hibernate Validator 4 и Tomcat 6

2 голосов
/ 25 февраля 2010

Проблема в том, что моя проверка бинов не работает так, как я ожидал .

У меня есть управляемый компонент Session Scoped с полем name, привязанным к h:inputText. Имя должно быть введено и иметь минимальную длину 1 символ и максимальную длину 5 символов. Я ожидаю, что когда я введу имя в текстовое поле, оно будет соответствующим образом проверено компонентом поддержки, а в случае неудачи отобразятся соответствующие сообщения об ошибках.

Однако это не так. Проверки всегда терпят неудачу , даже если я введу действительный регистр в inputText (например, «abc»). При отладке приложения кажется, что метод доступа 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;
  }
}

Ниже приведен фрагмент HTML-файла 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 Service Pack 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>

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

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

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

0 голосов
/ 08 февраля 2011

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

0 голосов
/ 25 февраля 2010

Что касается вашего дополнительного вопроса - посмотрите эту матрицу - нет, они не совместимы.

О вопросе JSF - проверьте логи tomcat и консоль javascript firefox.

...