在 JSF 中使用 bean 验证进行本地化

Posted

技术标签:

【中文标题】在 JSF 中使用 bean 验证进行本地化【英文标题】:Localization with bean validation in JSF 【发布时间】:2012-06-10 13:27:15 【问题描述】:

我使用 JSF 2.0 和 RichFaces 4 创建了一个基于 MVC 的网站。每个输入文本验证都是使用 bean 验证注释完成的。我正在使用 Hibernate Validator 作为 bean 验证实现。

如何显示本地化消息?

如果我使用

@NotNull(message="<h:outputText value=\"#msg['Mymessage']\" />")

然后它将&lt;h:outputText value="#msg['Mymessage']" /&gt; 显示为消息。

这是怎么引起的,我该如何解决?

【问题讨论】:

【参考方案1】:

对于那些和我有同样问题的人(@BalusC 给出的解决方案不适用于多种语言的许多不同属性文件),要做的事情是按以下模式命名所有属性文件: ValidationMessages_xx.properties

我不知道为什么,但是 ...xx_XX... 模式对我不起作用。

【讨论】:

模式xx_XX 用于特定于区域的语言环境,例如英式英语是en_UK,而en 仅代表英语。您应该始终使用通用变体来回退,然后它就会起作用。【参考方案2】:

您应该也不能在消息中放置 JSF 标记。此外,JSF 自己的资源包不会用于解析本地化验证消息。 JSR303 bean 验证是一个与 JSF 无关的完全独立的 API。

要国际化 JSR303 bean 验证消息,您需要在类路径根目录中创建一个单独的 ValidationMessages.properties 文件,该文件可以通过 ValidationMessages_xx_XX.properties 文件进行本地化。

例如

ERVNomView=Your message here

然后使用key 语法指定。

@NotEmpty(message="ERVNomView")

另见:

Chapter 4.3.1.1 of the JSR303 specification

【讨论】:

以上是关于在 JSF 中使用 bean 验证进行本地化的主要内容,如果未能解决你的问题,请参考以下文章

如何对 jsf 复合组件中的集合属性进行 bean 验证,约束不会触发

CAS 身份验证后在 JSF 托管 Bean 中获取 LDAP 属性

托管 bean 问题中的用户输入验证(JSF 2.0)

有没有支持 JSF 页面本地化的工具?

基于 JSF 表单的身份验证 + 托管 Bean 登录不起作用

如何使用 Spring Security 3.1.3 和 JSF 创建一个 Bean 来验证我的登录表单