JSf 2 с Hibernate Validator 4 и Tomcat 6

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

У меня есть управляемый компонент сеанса с полем 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;
  }
}

Ниже приведен фрагмент файла JSF xhtml. Я пробовал несколько разных вариантов с отдельными формами, но первый вариант — это тот, который я бы предположил, что он работает (я думаю, что он эквивалентен третьему варианту, но на всякий случай попробовал :))

<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>

person jamiebarrow    schedule 24.02.2010    source источник
comment
Другой связанный с этим вопрос заключается в том, совместима ли эта комбинация Hibernate Entity Manager и Hibernate Validator.   -  person jamiebarrow    schedule 25.02.2010
comment
И я еще не пробовал это на Glassfish, иногда между Tomcat и Glassfish есть различия (например, ValueChangeEvent.getNewValue() возвращает String на Tomcat, тогда как он представляет Integer и возвращает Integer на Glassfish). Может быть, стоит сделать, посмотрим, когда я вернусь к этому.   -  person jamiebarrow    schedule 25.02.2010
comment
У меня точно такая же проблема с валидатором Hibernate 4.0.2 + Mojarra 2.0.2 на Jetty. Вы нашли причину этого?   -  person Tuukka Mustonen    schedule 02.07.2010
comment
Хорошо, я нашел свою проблему. Он должен быть таким же, как у вас (который вы, вероятно, решили несколько раз назад). Я добавил резолюцию в качестве ответа.   -  person Tuukka Mustonen    schedule 06.07.2010
comment
:) В итоге я не использовал его в проекте, в котором участвовал, поэтому не решил его. Рассматривал возможность использования Hibernate Validator, но архитектор пока не хотел его вводить. Большое спасибо, это так просто, не могу поверить, что не подобрал это раньше   -  person jamiebarrow    schedule 06.07.2010


Ответы (3)


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

person Tuukka Mustonen    schedule 06.07.2010
comment
Спасибо Туукка, это имеет смысл. Еще не вернулся к этому, ушел в разные проекты, надеюсь, попробую в свободное время. - person jamiebarrow; 06.07.2010
comment
Кажется, это популярный вопрос. Я дам вам ответ, хотя еще не пробовал решение - person jamiebarrow; 26.08.2010

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

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

person Bozho    schedule 25.02.2010
comment
Я не думаю, что это имеет какое-либо отношение к Javascript, хотя сообщение успешно доходит до сервера ... какие-либо проблемы, с которыми вы столкнулись в связи с этим? Это не исключение, поэтому я думаю, что это не будет отображаться в журналах Tomcat, но это отмечено. Я не помню ничего необычного в журналах, но я проверю их снова, когда вернусь к этому. Спасибо за ссылку, я был там раньше, но на самом деле никогда не прокручивал достаточно далеко, предполагая, что последние выпуски будут совместимы: B Хотя я пробовал это и с 3.1.0 GA, но безуспешно, если я правильно помню. - person jamiebarrow; 25.02.2010
comment
также уменьшите порог ведения журнала вашего регистратора. - person Bozho; 25.02.2010
comment
Но что, если мне нужно ведение журнала для отладки, для этого и предназначено ведение журнала: D сокращение его до WARN действительно помогает, но это все еще очень медленно. Пока меня это не слишком беспокоит, так как, если возникнет проблема, я все равно просто подключу отладчик или увеличу его до TRACE и буду использовать Tomcat вне какой-либо IDE (немного больно, но эй) - person jamiebarrow; 25.02.2010
comment
уменьшить порог = сделать уровень лога ниже, т.е. DEBUG или TRACE. - person Bozho; 25.02.2010
comment
Ах, извините, я думал, что вы имели в виду наоборот :) это уже в TRACE и очень медленно с Glassfish - связано с комментарием к другому вопросу о переполнении стека, который у меня есть - извините за путаницу. Я вернусь к этому завтра, наверное. - person jamiebarrow; 25.02.2010

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

person davidxxx    schedule 08.02.2011