我有一个JSF 2应用程序,我无法在JSF ManagedBean属性上进行@Email验证 .
这是我的堆栈:
-
Glassfish 3.1.1
-
Mojarra 2.2.9 / JSF 2.2
我已经检查了我的web-inf / class我将这些库推荐为here:
-
javax.validation:validation-api:jar:1.0.0.GA
-
org.hibernate:hibernate-validator:jar:4.3.2.Final
我的代码:
<h:body>
<!-- <h:log id="log" /> -->
<h:messages globalOnly="true" style="color:red;margin:8px;" />
<h:form id="form">
<f:validateBean>
<h:outputLabel for="email" value="Enter your email: " />
<h:inputText id="email" value="#{userEditBean.email}" />
<h:message for="email" />
<h:commandButton type="submit" value="Enviar"
action="#{userEditBean.submit()}" />
</f:validateBean>
</h:form>
托管bean:
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.validation.constraints.Pattern;
@ManagedBean
@SessionScoped
public class UserEditBean {
private static final String CURRENT_PAGE = "";
private static final String USER_LIST_PAGE = "userList";
//@Pattern(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+", message = "Email format is invalid.")
@Email(message = "Email format is invalid.")
private String email;
public String submit() {
return CURRENT_PAGE;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
笔记:
-
JSR 303标准验证(@Null,@ NotNull,...)工作完美,我可以使用@Pattern进行电子邮件验证,如here所示,但我想知道为什么其他hibernate验证器注释不起作用 .
-
如果我尝试在使用@Email注释的属性中插入包含无效电子邮件的模型,则Hibernate验证器可以正常工作,hibernate会在preinsert验证中引发异常 .
-
我已经尝试过注释字段或getter,如上所述here,它们都没有工作 .
-
我已经过了hibernate validator reference integration chapter,但它只是说你必须使用标签来强制验证 .
是否可以在JSF bean中使用来自hibernate验证器的附加注释,或者仅使用javax.validation.constraints . *标准的注释? (without using validator programmatically)
UPDATED: 2015-03-23: in response to BalusC answer:
Glassfish 3.1.1附带了hibernate-validator包,它和我正在使用的版本相同,我可以在服务器启动日志中看到:
2015-03-23T14:11:24.772+0100|Información: Inicializando Mojarra 2.2.9 (-SNAPSHOT 20141218-0939 https://svn.java.net/svn/mojarra~svn/tags/2.2.9@14083) para el contexto '/fwk4jsf'
2015-03-23T14:11:25.368+0100|Información: HV000001: Hibernate Validator 4.3.2.Final
而且我的glassfish-web.xml中也有delegate =“true”,但它也不起作用 .
谢谢 .
1 回答
GlassFish作为一个Java EE容器 already 随附了JSF和Bean Validation . 应该通过替换
/glassfish/modules
文件夹中的JAR来完成升级 .如果出于某种原因无法实现这一点,并且您确实需要通过webapp升级它们,那么您需要通过向
glassfish-web.xml
添加以下条目来指示GlassFish首先在webapp中查找库:否则GlassFish仍然会从自己的库加载它们和/或类加载会出现问题,因为存在具有相同名称的重复类,导致具有多个类加载器的应用程序中的库之间的混淆和冲突,例如
instanceof
错误地在实例上返回false
由另一个可以访问重复库的类加载器加载的类 .