Bean验证多语言消息失败

时间:2012-04-03 17:49:21

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

我正在使用Spring 3.1.0.RELEASE,JSF 2.x,JPA 2和Hibernate Provider进行Web应用程序。该应用程序在Tomcat 6.X上运行。

网络应用可以用不同的语言显示:en,es,fr。

我在我的实体中使用bean验证。 Hibernate Validator是提供程序,版本4.2.0.Final。

我在实体中有以下代码:

@Email
    @Size(max=255)
    @Column(name = "email_ceo", length = 255)
    private String emailCeo;

@NotEmpty
    @OrderBy("position ASC")
    @OneToMany(cascade = ALL, mappedBy = "site", fetch = FetchType.EAGER)
    private List<SiteLanguage> langs;

我像这样处理异常:

try {
            siteService.createSite(newSite);
        } catch (ConstraintViolationException ex) {
            final FacesContext facesContext = FacesContext.getCurrentInstance();
            for (ConstraintViolation<?> cv : ex.getConstraintViolations()) {
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, cv.getMessage(), null));
            }
        }

我使用<h:messages />

在模板中显示错误消息

如何获取已翻译的邮件,因为cv.getMessage()始终会返回英文邮件?

对于电子邮件,它工作正常,我的语言很好。

还有第二件事,我不明白:

为什么@NotEmpty会抛出ConstraintViolationException而@Email却没有?

谢谢你。

2 个答案:

答案 0 :(得分:0)

  1. 使用区域设置。我们以前的方式是,基本上在表中的任何一种语言中使用语言环境字符串,并根据使用的语言环境(en,fr)来获取它。

  2. 使用catch Exception e捕获所有异常,然后查看被抛出的类型。它将按顺序捕获它并从catch子句继续。因此,抛出的第一个异常将退出try块。

  3.   

    @Email

         

    字段/属性。需要成为一个字符串。

         

    检查指定的字符串是否为有效的电子邮件地址。

    http://docs.jboss.org/hibernate/validator/4.0.1/api/org/hibernate/validator/constraints/Email.html

答案 1 :(得分:0)

使用cv.getMessageTemplate()代替cv.getMessage(),它将在约束消息模板中返回,例如。 {} javax.validation.constraints.NotNull.message。如果您有ResourceBundle文件(随Bean Validation实现或您自己提供),那么您可以用所选语言检索消息。

@Email不是Bean Validation内置约束,因此它不会被JSF 2.0触发。编写自己的@Email约束(或包装Hibernate Validator提供的约束),以便Bean验证可以识别它。