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

Mah*_*leh 27 jsf tomcat bean-validation jsf-2

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

@NotBlank(message = "{name.required}")
public String name;
Run Code Online (Sandbox Code Playgroud)

视图:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?

Bal*_*usC 66

介绍

由于您没有对我的评论提出任何反馈,问题是您正在使用哪个容器,我在您的问题历史中偷看,了解您正在使用的容器.到目前为止,我发现只有Tomcat.所以我会回答这个问题,假设您确实在使用Tomcat,因为我在发布评论时最初猜到了.

确保安装所有JAR

Tomcat没有附带任何JSR303 Bean Validation API /实现.您需要自己下载并安装它.你有这些注释进行编译意味着你已经正确地删除了webapp文件夹中的hibernate-validator.jar文件(命名可能因版本而异)/WEB-INF/lib.那些注释反过来似乎没有任何作用只能意味着你没有阅读readme.txt和/或忘记从/lib/requiredHibernate Validator库zip/tgz文件的文件夹中添加JAR :slf4j-api.jarvalidation-api.jar.最后一个是强制性的,以便获得实际工作的注释.因此,要使Hibernate Validator在Tomcat中工作,您需要在webapp中使用以下JAR /WEB-INF/lib:

  • validation-api.jar (包含抽象API和注释扫描程序)
  • hibernate-validator.jar (包含具体实现)
  • slf4j-api.jar (只是让它的记录器工作)

这种方式@NotBlank,@NotEmpty必须工作.该@NotNull值得特别关注; 由于HTTP请求参数的性质,默认情况下空输入字段作为空字符串从客户端(webbrowser)接收.空字符串不一样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>
Run Code Online (Sandbox Code Playgroud)

这种方式也@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>
Run Code Online (Sandbox Code Playgroud)

然后您应该将其删除(默认为auto,即仅在运行时类路径中找到JSR303 Bean Validation API时)或将其设置为true.

BV根本不起作用

当其实也没什么BV的工作,还没有@Size,@Pattern等等,那么你应该检查,如果你没有在你的格式如下:

<f:validateBean disabled="true" />
Run Code Online (Sandbox Code Playgroud)

然后你应该删除它(它将默认启动)或设置disabled="false".

确保你使用最新的Mojarra

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

  • 就像解决谋杀案一样. (6认同)
  • 嗨BalusC,对不起,我没有看到你对我的帖子的评论,但现在,非常感谢您的详细解释,问题是我有:<context-param> <param-name> javax.faces.VALIDATE_EMPTY_FIELDS </ param -name> <param-value> false </ param-value> </ context-param>我没有看到它,我只是使用了在线样本的web.xml,我是jsf的新手,非常感谢. (4认同)