我正在使用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
却没有?
谢谢你。
答案 0 :(得分:0)
使用区域设置。我们以前的方式是,基本上在表中的任何一种语言中使用语言环境字符串,并根据使用的语言环境(en,fr)来获取它。
使用catch Exception e
捕获所有异常,然后查看被抛出的类型。它将按顺序捕获它并从catch子句继续。因此,抛出的第一个异常将退出try块。
字段/属性。需要成为一个字符串。
检查指定的字符串是否为有效的电子邮件地址。
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验证可以识别它。