2

我遇到的问题是我的Bean Validation 没有像我预期的那样工作

我有一个 Session Scoped Managed Bean,其name字段绑定到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;
  }
}

下面是 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 的相关部分),在 Windows XP Pro Service 上的 Tomcat 6.0.20 中运行包 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

为了在这种情况下引发编译错误,我们可以使用 Hibernate Validator Annotation Processor。 休眠验证器

于 2011-02-08T14:49:22.387 回答
0

至于您的其他问题-请参阅此矩阵-不,它们不兼容。

关于 JSF 问题 - 检查 tomcat 日志和 firefox javascript 控制台。

于 2010-02-25T06:09:02.350 回答