我已经成功地集成了JSF (Mojarra)和CDI (Weld),但是无法使Hibernate Validator工作。
下面的jar被添加到WEB-INF/lib:
validation-api-1.1.0.Final.jar
hibernate-validator-5.1.0.Final.jar
jboss-logging-3.1.3.GA.jar
classmate-1.0.0.jar
Tomcat 7自带EL 2.2 jar,所以我没有添加它们。
我的JSF页面:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:form>
<h1><h:outputText id="hello" value="Hello, #{testController.name}!"/></h1>
<p:inputText id="name" value="#{testController.name}"/>
<h:message id="error" for="name"/>
<h:commandButton value="Change Name">
<f:ajax execute="name" render="hello error"/>
</h:commandButton>
</h:form>
</h:body>
</html>
和我的背豆:
@Named
@ApplicationScoped
public class TestController {
@NotNull
@Size(min = 3, max = 5)
private String name;
@PostConstruct
private void init() {
name = "Bill";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
当名称的大小小于3或大于5时,预计会显示错误消息,但事实并非如此。似乎Hibernate验证器不工作。我确实看到它被检测到,但不再记录:
Mar 11, 2014 9:31:40 PM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.0.Final
有什么问题吗?
最后我发现这是Mojarra回归。Hibernate验证器现在可以使用MyFaces了
只是为了避免混淆(因为我一直感到困惑,寻找错误,尽管它已经解决了,因为我没有看到更新部分在帖子的末尾),让我代表OP添加答案:
似乎OP使用了一个坏了的Mojarra版本。他们通过迁移到MyFaces解决了这个问题(参见问题的更新)。顺便说一下,我用Mojarra 2.2.12尝试了他们的例子,它工作得很好。
当您说您与Tomcat 7集成时,您是如何做到的?在应用服务器中有一些粘合代码,以确保ValidatorFactory对JSF是可见的。我不确定你是否也需要这样的服务。
您是否启用了调试/跟踪日志记录来验证Validator是否启动或被调用?
也可以尝试添加到JSF页面,但这应该是可选的。
您是否错过了页面上的<f:validateBean>
标记?我认为你可能还需要调用Validator.validate(bean)
方法,以便让它着火。