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

我在我的JSF托pipebean中使用Hibernate Validation注解。 当我使用@NotBlank @NotEmpty@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" /> 

这是如何造成的,我该如何解决?

介绍

由于您对我的评论没有提供任何反馈意见,所以我在您的问题历史logging中偷看了您正在使用的容器。 至今我只find了Tomcat 。 所以我会为这个答案假设你确实使用了Tomcat,正如我最初在发表评论时所猜测的那样。

确保你安装了所有的JAR

Tomcat没有提供任何JSR303 BeanvalidationAPI /实现。 你需要自己下载并安装它。 你得到这些注释来编译意味着你已经正确地删除了你的webapp的/WEB-INF/lib文件夹中的hibernate-validator.jar文件(命名可能会有所不同)。 这些注释反过来似乎没有任何意义,只能意味着你没有阅读readme.txt和/或忘记从Hibernate Validator库的zip / tgz文件的/lib/required文件夹中添加JAR : slf4j-api.jarvalidation-api.jar 。 最后一个是强制性的,以便使注释实际工作。 所以,为了让Hibernate Validator在Tomcat中工作,你需要在webapp的/WEB-INF/lib下面的JAR:

  • validation-api.jar (包含抽象API和注释扫描器)
  • hibernate-validator.jar (包含具体实现)
  • slf4j-api.jar (只是让它的logging器工作)

这样@NotBlank@NotEmpty必须工作。 @NotNull值得特别关注; 由于HTTP请求参数的性质,空input字段被默认地从客户端(网页浏览器)接收为空string。 空string与null不相同,所以@NotNull将默认不会启动。但是,通过将以下上下文参数添加到web.xml JSF可以被configuration为将它们解释为null

 <context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param> 

这样@NotNull必须工作。

BV工作,但只有空的领域没有

如果它仍然不起作用(即3个注释都不起作用,但其他像@Size(min=5)的最小长度为5的工作正常),那么机会很大,您在web.xml具有以下上下文参数web.xml也是如此:

 <context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>false</param-value> </context-param> 

您应该删除它(默认为auto ,即只有在运行时类path中findJSR303 BeanvalidationAPI时)或将其设置为true

BV根本不工作

当BV实际上没有任何工作时,也不是@Size@Pattern等,那么你应该validation你的表单中是否没有以下内容:

 <f:validateBean disabled="true" /> 

你应该删除它(只会默认启动)或设置disabled="false"

确保你使用最近的Mojarra

当BV 仍然不起作用时,请确认您是否使用2.2.3和2.2.6之间的旧版Mojarra版本。 这些版本有一个类加载委托错误导致Tomcat上的Beanvalidation和克隆是完全不可见的。 这被报道为Mojarra问题3183和固定在Mojarra 2.2.7。

我有一个类似的问题,我能够通过在web-inf lib中包含下面的三个jar子来解决这个问题。 只需添加hibernatevalidation器jar和压缩文件中提供的所需jar即可:

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

如果添加上述jar子后仍然无法validation,那么您可能错过了添加标签

  <mvc:annotation-driven /> 

在springconfiguration文件中。