我在JSF托管bean中使用了Hibernate Validation批注。当我使用时@NotNull,@NotBlank或者@NotEmpty它们似乎没有以任何方式被触发。
@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。
Tomcat并未附带任何JSR303 Bean验证API /实现。您需要自己下载并安装。您可以编译这些批注,这意味着您已正确将hibernate- validator.jar文件删除了(名称可能因版本而异)在/WEB- INF/libwebapp文件夹中。这些注释反过来似乎没有任何作用,仅意味着您没有阅读readme.txt和/或忘记从/lib/requiredHibernate Validator库zip / tgz文件的文件夹中添加JAR :slf4j-api.jar和validation- api.jar。为了使注释真正起作用,最后一个是强制性的。因此,要使Hibernate Validator在Tomcat中工作,您需要在webapp的以下JAR /WEB-INF/lib:
hibernate- validator.jar
/WEB- INF/lib
readme.txt
/lib/required
slf4j-api.jar
validation- api.jar
/WEB-INF/lib
validation-api.jar
hibernate-validator.jar
这种方式@NotBlank,@NotEmpty必须工作。该@NotNull值得特别关注; 由于HTTP请求参数的性质,默认情况下,即从客户端(Web浏览器)将空输入字段作为空字符串接收。空字符串与并不相同null,因此@NotNull默认情况下不会插入任何字符串。但是null,只需将以下上下文参数添加到,JSF就可以配置为解释它们web.xml:
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>
这种方式也@NotNull必须工作。
如果它 仍然 不起作用(即3个注释中的任何一个都不起作用,但是其他注释(@Size(min=5)最小长度为5)可以正常工作),那么web.xml很有可能您还具有以下上下文参数:
@Size(min=5)
<context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>false</param-value> </context-param>
然后,您应该将其删除(默认为auto,即仅当在运行时类路径中找到JSR303 Bean验证API时)或将其设置为true。
auto
true
当BV实际上什么都不起作用@Size时@Pattern,,等也不起作用,那么您应该验证您的表单中是否 没有 以下内容:
@Size
@Pattern
<f:validateBean disabled="true" />
然后,您应该将其删除(默认情况下将自动踢入)或进行设置disabled="false"。
disabled="false"
如果BV _仍然_无法正常工作,请确认您是否未使用2.2.3和2.2.6之间的旧版Mojarra。这些版本有一个类加载委托错误,导致在Tomcat和克隆上的Bean验证完全不可见。据报道,这是Mojarra问题3183,已在Mojarra2.2.7中修复。