Bean 验证 @NotNull、@NotBlank 和 @NotEmpty 在 JSF+Tomcat 中不起作用 [英] Bean Validation @NotNull, @NotBlank and @NotEmpty does not work in JSF+Tomcat

查看:33
本文介绍了Bean 验证 @NotNull、@NotBlank 和 @NotEmpty 在 JSF+Tomcat 中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 JSF 托管 bean 中使用 Hibernate Validation 注释.当我使用 @NotNull@NotBlank@NotEmpty 时,它们似乎没有以任何方式被触发.

@NotBlank(message = "{name.required}")公共字符串名称;

查看:

<h:inputText id="name" value="#{person.name}" size="20"/><h:message for="name" style="color:red"/>

这是怎么引起的,我该如何解决?

解决方案

简介

由于您没有对我关于您使用的是什么容器的评论提供任何反馈,因此我查看了您的问题历史记录以了解您都在使用哪些容器.到目前为止,我只发现了 Tomcat.因此,对于这个答案,我假设您确实在使用 Tomcat,正如我在发布评论时最初猜测的那样.

确保安装所有 JAR

Tomcat 不附带任何现成的 JSR303 Bean 验证 API/实现.您需要自己下载并安装.编译这些注释意味着您已正确删除 /WEB-INF/lib 文件夹中的 hibernate-validator.jar 文件(命名可能因版本而异)你的网络应用程序.这些注释反过来似乎不起作用只能意味着您没有阅读 readme.txt 和/或忘记从 /lib/required 添加 JAR Hibernate Validator 库 zip/tgz 文件的文件夹:slf4j-api.jarvalidation-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 来将它们解释为 null代码>web.xml:

<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 中还有以下上下文参数:

<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 等,那么您应该验证您的表单中是否没有具有以下内容:

然后您应该删除它(默认情况下它只会启动)或设置 disabled="false".

确保您使用最新的 Mojarra

当 BV 仍然 不起作用时,请验证您是否没有使用 2.2.3 和 2.2.6 之间的旧 Mojarra 版本.这些版本有一个类加载委托错误,导致 Tomcat 和克隆上的 Bean 验证完全不可见.这被报告为 Mojarra 问题 3183 并在 Mojarra 2.2.7 中修复.

I am using Hibernate Validation annotations in my JSF managed bean. When I use @NotNull, @NotBlank or @NotEmpty they doesn't seem to be triggered in any way.

@NotBlank(message = "{name.required}")
public String name;

View:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />

How is this caused and how can I solve it?

解决方案

Introduction

Since you didn't give any feedback on my comment with the question what container you're using, I peeked around in your question history to learn what containers you're all using. As far I found only Tomcat. So I'll for this answer assume that you're indeed using Tomcat as I initially guessed while posting the comment.

Make sure you install all JARs

Tomcat does not ship with any JSR303 Bean Validation API/implementation out the box. You need to download and install it yourself. That you got those annotations to compile means that you've correctly dropped the hibernate-validator.jar file (naming may differ per version) in /WEB-INF/lib folder of your webapp. That those annotations in turn does not seem to work in any way can only mean that you didn't read the readme.txt and/or forgot to add the JARs from the /lib/required folder of the Hibernate Validator library zip/tgz file: slf4j-api.jar and validation-api.jar. The last one is mandatory in order to get the annotations to actually work. So, to get Hibernate Validator to work in Tomcat, you need the following JARs in webapp's /WEB-INF/lib:

  • validation-api.jar (contains the abstract API and the annotation scanner)
  • hibernate-validator.jar (contains the concrete implementation)
  • slf4j-api.jar (just to get its logger to work as well)

This way @NotBlank and @NotEmpty must work. The @NotNull deserves special attention; empty input fields are namely by default received as empty strings from the client (webbrowser) due to the nature of HTTP request parameters. Empty strings are not the same as null, so the @NotNull will by default never kick in. JSF is however configureable to interpret them as null by just adding the following context parameter to web.xml:

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

This way the @NotNull must work as well.

BV works but only empty fields not

If it still doesn't work (i.e. none of the 3 annotations work, but others like @Size(min=5) for a minimum length of 5 works fine), then chances are big that you've the following context parameter in web.xml as well:

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

You should then remove it (it defaults to auto, i.e. only when JSR303 Bean Validation API is found in runtime classpath) or to set it to true.

BV does not work at all

When actually nothing of BV works, also not @Size, @Pattern, etc, then you should verify if you do not have the following in your form:

<f:validateBean disabled="true" />

You should then remove it (it will just by default kick in) or to set disabled="false".

Make sure you use most recent Mojarra

When BV still doesn't work, then verify if you're not using an old Mojarra version between 2.2.3 and 2.2.6. Those versions had a classloading delegate bug causing Bean Validation on Tomcat and clones to be completely invisible. This is reported as Mojarra issue 3183 and fixed in Mojarra 2.2.7.

这篇关于Bean 验证 @NotNull、@NotBlank 和 @NotEmpty 在 JSF+Tomcat 中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆