@Email hibernate验证器注释在JSF 2 Bean中不起作用

时间:2015-03-20 12:43:08

标签: jsf-2 bean-validation managed-bean hibernate-validator

我有一个JSF 2应用程序,我无法在JSF ManagedBean属性上进行@Email验证。

这是我的堆栈:

  • Glassfish 3.1.1
  • Mojarra 2.2.9 / JSF 2.2

我已经在我的网络inf /类中检查了我推荐这些库here

  • javax.validation:验证-API:罐:1.0.0.GA
  • org.hibernate作为:休眠-验证:罐: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,如上所述[{3}},但它们都没有工作。
  • 我已经查看了here,但它只是说您必须使用该标记来强制验证。

是否可以在JSF bean中使用来自hibernate验证器的附加注释,或者只使用javax.validation.constraints。*标准的注释? (hibernate validator reference integration chapter

更新日期:2015-03-23:回应BalusC回答:

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 个答案:

答案 0 :(得分:1)

GlassFish作为一个Java EE容器已经附带了JSF和Bean Validation。升级它们应该通过替换/glassfish/modules文件夹中的JAR来完成。

如果由于某种原因无法实现这一点,并且您确实需要通过webapp升级它们,那么您需要指示GlassFish首先通过向glassfish-web.xml添加以下条目来查看库的webapp:

<class-loader delegate="false" />

否则GlassFish仍会从自己的库中加载它们和/或类加载会出现问题,因为存在具有相同名称的重复类,导致具有多个类加载器的应用程序中库之间的混淆和冲突,例如instanceof错误地在有权访问副本库的另一个类加载器加载的类的实例上返回false