一尘不染

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

tomcat

我在JSF托管bean中使用了Hibernate
Validation批注。当我使用时@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" />

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


阅读 494

收藏
2020-06-16

共1个答案

一尘不染

介绍

由于您未对使用的是哪个容器的问题发表评论,因此我在您的问题历史记录中进行了了解,以了解所有使用的容器。到目前为止,我只找到了Tomcat。因此,对于这个答案,我将假设您确实使用了我最初在发布评论时所猜测的Tomcat。

确保安装所有JAR

Tomcat并未附带任何JSR303 Bean验证API
/实现。您需要自己下载并安装。您可以编译这些批注,这意味着您已正确将hibernate- validator.jar文件删除了(名称可能因版本而异)在/WEB- INF/libwebapp文件夹中。这些注释反过来似乎没有任何作用,仅意味着您没有阅读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请求参数的性质,默认情况下,即从客户端(Web浏览器)将空输入字段作为空字符串接收。空字符串与并不相同null,因此@NotNull默认情况下不会插入任何字符串。但是null,只需将以下上下文参数添加到,JS​​F就可以配置为解释它们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验证API时)或将其设置为true

BV根本不起作用

当BV实际上什么都不起作用@Size@Pattern,,等也不起作用,那么您应该验证您的表单中是否
没有 以下内容:

<f:validateBean disabled="true" />

然后,您应该将其删除(默认情况下将自动踢入)或进行设置disabled="false"

确保使用最新的Mojarra

如果BV _仍然_无法正常工作,请确认您是否未使用2.2.3和2.2.6之间的旧版Mojarra。这些版本有一个类加载委托错误,导致在Tomcat和克隆上的Bean验证完全不可见。据报道,这是Mojarra问题3183,已在Mojarra2.2.7中修复。

2020-06-16