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



我在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.jarvalidation-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 />

最新更新