Bean Validation @NotNull,@NotBlank和@NotEmpty在JSF + Tomcat中不起作用
我在我的JSF托pipebean中使用Hibernate Validation注解。 当我使用@NotBlank
@NotEmpty
, @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" />
这是如何造成的,我该如何解决?
介绍
由于您对我的评论没有提供任何反馈意见,所以我在您的问题历史logging中偷看了您正在使用的容器。 至今我只find了Tomcat 。 所以我会为这个答案假设你确实使用了Tomcat,正如我最初在发表评论时所猜测的那样。
确保你安装了所有的JAR
Tomcat没有提供任何JSR303 BeanvalidationAPI /实现。 你需要自己下载并安装它。 你得到这些注释来编译意味着你已经正确地删除了你的webapp的/WEB-INF/lib
文件夹中的hibernate-validator.jar
文件(命名可能会有所不同)。 这些注释反过来似乎没有任何意义,只能意味着你没有阅读readme.txt
和/或忘记从Hibernate Validator库的zip / tgz文件的/lib/required
文件夹中添加JAR : slf4j-api.jar
和validation-api.jar
。 最后一个是强制性的,以便使注释实际工作。 所以,为了让Hibernate Validator在Tomcat中工作,你需要在webapp的/WEB-INF/lib
下面的JAR:
-
validation-api.jar
(包含抽象API和注释扫描器) -
hibernate-validator.jar
(包含具体实现) -
slf4j-api.jar
(只是让它的logging器工作)
这样@NotBlank
和@NotEmpty
必须工作。 @NotNull
值得特别关注; 由于HTTP请求参数的性质,空input字段被默认地从客户端(网页浏览器)接收为空string。 空string与null
不相同,所以@NotNull
将默认不会启动。但是,通过将以下上下文参数添加到web.xml
JSF可以被configuration为将它们解释为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
具有以下上下文参数web.xml
也是如此:
<context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>false</param-value> </context-param>
您应该删除它(默认为auto
,即只有在运行时类path中findJSR303 BeanvalidationAPI时)或将其设置为true
。
BV根本不工作
当BV实际上没有任何工作时,也不是@Size
, @Pattern
等,那么你应该validation你的表单中是否没有以下内容:
<f:validateBean disabled="true" />
你应该删除它(只会默认启动)或设置disabled="false"
。
确保你使用最近的Mojarra
当BV 仍然不起作用时,请确认您是否使用2.2.3和2.2.6之间的旧版Mojarra版本。 这些版本有一个类加载委托错误导致Tomcat上的Beanvalidation和克隆是完全不可见的。 这被报道为Mojarra问题3183和固定在Mojarra 2.2.7。
我有一个类似的问题,我能够通过在web-inf
lib中包含下面的三个jar子来解决这个问题。 只需添加hibernatevalidation器jar和压缩文件中提供的所需jar即可:
-
hibernate-validator-4.3.0.Final.jar
-
jboss-logging-3.1.0.CR2.jar
-
validation-api-1.0.0.GA.jar
如果添加上述jar子后仍然无法validation,那么您可能错过了添加标签
<mvc:annotation-driven />
在springconfiguration文件中。