我在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" />
这是如何引起的?如何解决?
答案 0 :(得分:65)
由于您没有就我对您使用的容器的问题给出任何反馈意见,因此我会在您的问题历史中查看,了解您正在使用的容器。到目前为止,我只发现了Tomcat。所以我会回答这个问题,假设你确实在使用Tomcat,就像我在发表评论时最初猜到的那样。
Tomcat未附带任何JSR303 Bean Validation API /实现。你需要自己download and install。你有这些注释进行编译意味着你已经正确地删除了你的webapp的hibernate-validator.jar
文件夹中的/WEB-INF/lib
文件(命名可能因版本而异)。这些注释反过来似乎没有任何作用只能意味着你没有阅读readme.txt
和/或忘记从Hibernate Validator库zip的/lib/required
文件夹中添加JAR / tgz文件:slf4j-api.jar
和validation-api.jar
。最后一个是强制性的,以便获得实际工作的注释。因此,要使Hibernate Validator在Tomcat中工作,您需要在webapp /WEB-INF/lib
中使用以下JAR:
validation-api.jar
(包含抽象API和注释扫描程序)hibernate-validator.jar
(包含具体实施)slf4j-api.jar
(只是为了让它的记录器工作)这种方式@NotBlank
和@NotEmpty
必须有效。 @NotNull
值得特别关注;由于HTTP请求参数的性质,默认情况下空输入字段作为空字符串从客户端(webbrowser)接收。空字符串与null
不同,因此@NotNull
默认情况下永远不会启动。但是,JSF可以通过向{{{{{}}添加以下上下文参数来将它们解释为null
。 1}}:
web.xml
这样@NotNull
也必须有效。
如果仍然不起作用(即3个注释都不起作用,但其他像@Size(min=5)
的最小长度为5的工作正常),那么你的机会很大<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
中也有以下上下文参数:
web.xml
然后您应该将其删除(默认为<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>
,即仅在运行时类路径中找到JSR303 Bean Validation API时)或将其设置为auto
。
当BV实际上没有任何作用,也不是@Size
,@Pattern
等时,您应该验证您是否不在表单中包含以下内容:
true
然后您应该将其删除(默认情况下会将其删除)或设置<f:validateBean disabled="true" />
。
当BV 仍然不起作用时,请验证您是否在2.2.3和2.2.6之间没有使用旧的Mojarra版本。这些版本有一个类加载委托错误导致Tomcat上的Bean Validation和克隆完全不可见。这被报告为Mojarra issue 3183并在Mojarra 2.2.7中修复。
答案 1 :(得分:4)
我有一个类似的问题,我能够通过在web-inf
lib中包含以下三个罐来克服这个问题。只需添加hibernate验证器jar和zip文件中提供的必需jar:
hibernate-validator-4.3.0.Final.jar
jboss-logging-3.1.0.CR2.jar
validation-api-1.0.0.GA.jar
答案 2 :(得分:-2)
如果在添加上述罐子后仍然无法验证,那么您可能错过了添加标签
<mvc:annotation-driven />
在spring配置文件中。