简介
由于您没有就您正在使用的容器问题对我的评论提供任何反馈,因此我查看了您的问题历史以了解您都在使用哪些容器。到目前为止,我只找到了Tomcat。因此,对于这个答案,我假设您确实在使用 Tomcat,正如我在发布评论时最初猜测的那样。
确保安装所有 JAR
Tomcat 不附带任何开箱即用的 JSR303 Bean 验证 API/实现。你需要自己download and install。您获得了要编译的注释意味着您已将 hibernate-validator.jar 文件(每个版本的命名可能不同)正确地放置在 webapp 的 /WEB-INF/lib 文件夹中。反过来,这些注释似乎无法以任何方式工作,这仅意味着您没有阅读 readme.txt 和/或忘记从 Hibernate Validator 库 zip/tgz 文件的 /lib/required 文件夹中添加 JAR: slf4j-api.jar 和 validation-api.jar。最后一个是强制性的,以使注释真正起作用。因此,要让 Hibernate Validator 在 Tomcat 中工作,您需要在 webapp 的 /WEB-INF/lib 中提供以下 JAR:
-
validation-api.jar(包含抽象 API 和注释扫描器)
-
hibernate-validator.jar(包含具体实现)
-
slf4j-api.jar(只是为了让它的记录器也能正常工作)
这种方式@NotBlank 和@NotEmpty 必须工作。 @NotNull 值得特别关注;由于 HTTP 请求参数的性质,空输入字段默认情况下作为空字符串从客户端(网络浏览器)接收。空字符串与null 不同,因此默认情况下@NotNull 不会启动。但是,JSF 可以配置为将它们解释为null,只需将以下上下文参数添加到web.xml:
<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 中还有以下上下文参数:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>
然后您应该删除它(它默认为 auto,即仅当在运行时类路径中找到 JSR303 Bean Validation API 时)或将其设置为 true。
BV 根本不起作用
如果 BV 实际上没有任何作用,@Size、@Pattern 等也不起作用,那么您应该验证您是否不在您的表单中包含以下内容:
<f:validateBean disabled="true" />
然后您应该删除它(默认情况下它会启动)或设置disabled="false"。
确保您使用的是最新的 Mojarra
当 BV 仍然 不起作用时,请验证您是否使用的是 2.2.3 和 2.2.6 之间的旧 Mojarra 版本。这些版本有一个类加载委托错误,导致 Tomcat 上的 Bean Validation 和克隆完全不可见。这被报告为 Mojarra issue 3183 并在 Mojarra 2.2.7 中修复。