我在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/实现。您需要自己下载并安装它。你得到那些注释编译意味着你已经正确地删除了hibernate-validator.jar
文件(命名可能不同于每个版本)在/WEB-INF/lib
文件夹的web应用程序。这些注释反过来似乎没有以任何方式工作,这只能意味着您没有读取readme.txt
和/或忘记从Hibernate Validator库zip/tgz文件的/lib/required
文件夹中添加jar: slf4j-api.jar
和validation-api.jar
。最后一个是必须的,以便让注释实际工作。因此,要使Hibernate验证器在Tomcat中工作,您需要在webapp的/WEB-INF/lib
中使用以下jar文件:
-
validation-api.jar
(包含抽象API和注释扫描仪) -
hibernate-validator.jar
(包含具体实现) -
slf4j-api.jar
(只是为了让它的记录器工作)
这样@NotBlank
和@NotEmpty
必须工作。@NotNull
值得特别注意;由于HTTP请求参数的性质,空输入字段默认情况下作为空字符串从客户端(web浏览器)接收。空字符串与null
不同,因此@NotNull
在默认情况下永远不会生效。但是,通过向web.xml
添加以下上下文参数,JSF可以配置为将它们解释为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
中也有以下上下文参数:
<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验证完全不可见。这个问题被报告为Mojarra issue 3183,并在Mojarra 2.2.7中修复。
我有一个类似的问题,我能够通过在web-inf
库中包含以下三个jar来克服这个问题。只需添加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
add
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
在web . xml 并添加
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.23.Final</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.13</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.13</version>
</dependency>
在pom . xml中如果在添加了上述指定的jar之后仍然无法验证,那么您可能没有添加标记
<mvc:annotation-driven />