我在我的 JSF 托管 bean 中使用 Hibernate 验证注释。当我使用 @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" />
这是怎么引起的,我该如何解决?
最佳答案
简介
由于您没有就我使用的容器问题的评论提供任何反馈,我浏览了您的问题历史记录以了解您都在使用哪些容器。到目前为止我只找到Tomcat .因此,对于这个答案,我假设您确实在使用 Tomcat,正如我最初在发表评论时猜测的那样。
确保安装所有 JAR
Tomcat 不附带任何开箱即用的 JSR303 Bean 验证 API/实现。你需要 download and install它自己。你得到了这些注释来编译意味着你已经正确地删除了 hibernate-validator.jar
/WEB-INF/lib
中的文件(命名可能因版本而异)您的网络应用程序的文件夹。这些注释反过来似乎并没有以任何方式起作用只能意味着您没有阅读 readme.txt
和/或忘记从 /lib/required
添加 JAR Hibernate Validator 库 zip/tgz 文件的文件夹: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 版本。这些版本有一个类加载委托(delegate)错误,导致 Tomcat 和克隆上的 Bean 验证完全不可见。这被报告为 Mojarra issue 3183并在 Mojarra 2.2.7 中修复。
关于jsf - Bean 验证@NotNull、@NotBlank 和@NotEmpty 在 JSF+Tomcat 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545231/