Bean验证@NotNull,@ NotBlank和@NotEmpty在JSF + Tomcat中不起作用

时间:2011-09-25 11:34:23

标签: jsf tomcat jsf-2 bean-validation

我在JSF托管bean中使用Hibernate Validation注释。当我使用@NotNull@NotBlank@NotEmpty时,它们似乎无法以任何方式触发。

@NotBlank(message = "{name.required}")
public String name;

查看:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />

这是如何引起的?如何解决?

3 个答案:

答案 0 :(得分:65)

简介

由于您没有就我对您使用的容器的问题给出任何反馈意见,因此我会在您的问题历史中查看,了解您正在使用的容器。到目前为止,我只发现了Tomcat。所以我会回答这个问题,假设你确实在使用Tomcat,就像我在发表评论时最初猜到的那样。

确保安装所有JAR

Tomcat未附带任何JSR303 Bean Validation API /实现。你需要自己download and install。你有这些注释进行编译意味着你已经正确地删除了你的webapp的hibernate-validator.jar文件夹中的/WEB-INF/lib文件(命名可能因版本而异)。这些注释反过来似乎没有任何作用只能意味着你没有阅读readme.txt和/或忘记从Hibernate Validator库zip的/lib/required文件夹中添加JAR / tgz文件:slf4j-api.jarvalidation-api.jar。最后一个是强制性的,以便获得实际工作的注释。因此,要使Hibernate Validator在Tomcat中工作,您需要在webapp /WEB-INF/lib中使用以下JAR:

  • validation-api.jar(包含抽象API和注释扫描程序)
  • hibernate-validator.jar(包含具体实施)
  • slf4j-api.jar(只是为了让它的记录器工作)

这种方式@NotBlank@NotEmpty必须有效。 @NotNull值得特别关注;由于HTTP请求参数的性质,默认情况下空输入字段作为空字符串从客户端(webbrowser)接收。空字符串与null不同,因此@NotNull默认情况下永远不会启动。但是,JSF可以通过向{{{{{}}添加以下上下文参数来将它们解释为null。 1}}:

web.xml

这样@NotNull也必须有效。

BV有效,但只有空字段

如果仍然不起作用(即3个注释都不起作用,但其他像@Size(min=5)的最小长度为5的工作正常),那么你的机会很大<context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param> 中也有以下上下文参数:

web.xml

然后您应该将其删除(默认为<context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>false</param-value> </context-param> ,即仅在运行时类路径中找到JSR303 Bean Validation API时)或将其设置为auto

BV根本不起作用

当BV实际上没有任何作用,也不是@Size@Pattern等时,您应该验证您是否在表单中包含以下内容:

true

然后您应该将其删除(默认情况下会将其删除)或设置<f:validateBean disabled="true" />

确保使用最新的Mojarra

当BV 仍然不起作用时,请验证您是否在2.2.3和2.2.6之间没有使用旧的Mojarra版本。这些版本有一个类加载委托错误导致Tomcat上的Bean Validation和克隆完全不可见。这被报告为Mojarra issue 3183并在Mojarra 2.2.7中修复。

答案 1 :(得分:4)

我有一个类似的问题,我能够通过在web-inf lib中包含以下三个罐来克服这个问题。只需添加hibernate验证器jar和zip文件中提供的必需jar:

  • hibernate-validator-4.3.0.Final.jar
  • jboss-logging-3.1.0.CR2.jar
  • validation-api-1.0.0.GA.jar

答案 2 :(得分:-2)

如果在添加上述罐子后仍然无法验证,那么您可能错过了添加标签

 <mvc:annotation-driven />

在spring配置文件中。