我遇到的问题是,我的 Bean验证不工作,我期望

我有一个会话范围托管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实体管理3.3.2.GA和Hibernate验证4.0.2.GA(以下是我的Maven POM的相关部分),在Windows上运行在Tomcat中6.0.20 XP专业版服务包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>
有帮助吗?

解决方案

您验证是否正常工作。问题是你@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;
}

不更新豆字段,因为验证失败。只有在验证成功将豆得到更新。

其他提示

至于你的其他问题 - 看到这个矩阵 - 不,他们是不兼容的。

关于JSF问题 - 同时检查Tomcat的日志和Firefox的JavaScript控制台

为了在这样的情况下,以提高编译错误,我们可以使用Hibernate验证注解处理器。 Hibernate验证

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top