【问题标题】:@Email hibernate validator annotation not working in JSF 2 Bean@Email 休眠验证器注释在 JSF 2 Bean 中不起作用
【发布时间】:2015-03-20 12:43:07
【问题描述】:

我有一个 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 所示,但我想知道为什么其他休眠验证器注释不工作。
  • 如果我尝试在使用 @Email 注释的属性中插入带有无效电子邮件的模型,Hibernate 验证器可以完美运行,Hibernate 在预插入验证中会引发异常。
  • 我已经尝试过注释字段或 getter,正如 here 中提到的那样,它们都不起作用。
  • 我已经查看了hibernate validator reference integration chapter,但它只是说您必须使用标签来强制验证。

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

更新: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",但它也不起作用。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    如果由于某种原因无法做到这一点,并且您确实需要通过 web 应用程序升级它们,那么您需要通过将以下条目添加到 glassfish-web.xml 来指示 GlassFish 首先在 web 应用程序中查找库:

    <class-loader delegate="false" />
    

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

    【讨论】:

    • 它不起作用,glassfish 具有与我在应用程序中使用的相同的休眠验证器版本。我已经编辑了问题。
    • 那你为什么要在 webapp 中提供呢?
    • 好点子!我拥有它是因为我需要它来进行测试,并且我想确保它是 hibernate-validator 标准,而不是 glassfish 开发人员修改的标准。将依赖项设置为提供解决了问题,现在验证工作。谢谢!。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2018-05-24
    相关资源
    最近更新 更多