2

私が抱えている問題は、BeanValidationが期待どおりに機能していないことです。

nameにバインドされたフィールドを持つSessionScopedManagedBeanがありh:inputTextます。名前を入力する必要があり、最小長は1文字、最大長は5文字です。テキストボックスに名前を入力すると、それに応じてバッキングBeanによって検証され、失敗した場合は、対応するエラーメッセージが表示されると思います。

ただし、そうではありません。inputTextに有効なケース(「abc」など)を入力した場合でも、検証は常に失敗します。アプリケーションのデバッグ時に、getName()アクセサーが常に呼び出され、セッターに到達することはないようです。私は何か間違ったことをしていますか?バリデーターはアクセサーを使用して検証すると思いますが、問題は、セッターが名前の値を更新する機会がないことです...何かが足りないに違いありません。

以下はマネージド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;
  }
}

以下は、JSFxhtmlのフラグメントです。別々のフォームでいくつかの異なるバリエーションを試しましたが、最初のオプションは私が機能すると想定するものです(3番目のオプションと同等だと思いますが、念のために試しました:))

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

Windows XPProサービスのTomcat6.0.20で実行されている、Hibernate EntityManager3.3.2.GAおよびHibernateValidator4.0.2.GA(以下はMaven POMの関連部分)でJSF2.0.2-FCSを使用しています。パック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>
4

3 に答える 3

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

検証が失敗したため、Beanフィールドは更新されません。検証が成功した後にのみ、Beanが更新されます。

于 2010-07-06T08:40:39.027 に答える
0

追加の質問については、このマトリックスを参照してください。いいえ、互換性はありません。

JSFの質問について-tomcatログとfirefoxjavascriptコンソールの両方を確認してください。

于 2010-02-25T06:09:02.350 に答える
0

このような場合にコンパイルエラーを発生させるために、Hibernate ValidatorAnnotationProcessorを使用できます。 Hibernateバリデーター

于 2011-02-08T14:49:22.387 に答える