如何本地化JSF 2复合组件

时间:2011-10-19 07:28:02

标签: java jsf java-ee jsf-2 java-ee-6

我对JSF中复合组件的本地化如何工作有一些疑问,我想了解它是如何工作的。

所以我决定用一个小例子练习复合组件的本地化。

根据建议我在复合组件所在的完全相同的文件夹中创建了一个.properties文件(WebContent / resources的子文件夹)

labelField1 = FIELD 1
labelField2 = FIELD 2

然后我用#{cc.resourceBundleMap。将本地化文本添加到组件implmentation:

<html>

<composite:interface>
        ...
</composite:interface>

<composite:implementation>
    <h:form>
            <h:outputText value="#{cc.resourceBundleMap.labelField1}"/>
                                      ...
            <h:outputText value="#{cc.resourceBundleMap.labelField2}"/>
                                              ...
    </h:form>

</composite:implementation> 

</html>

运行应用程序时出现的问题是:

SEVERE: Error Rendering View[/index.xhtml]
javax.el.ELException: /resources/custom/demoCustomComponent.xhtml @14,63 value="#{cc.resourceBundleMap.labelField1}": java.lang.NullPointerException
....
Caused by: java.lang.NullPointerException
at javax.faces.component.UIComponent.findComponentResourceBundleLocaleMatch(UIComponent.java:1000)

...

我的问题是:

- 我是否需要以某种方式手动加载该消息包或这应该自动发生?

- 我的应用程序中的其他消息包在复合组件所在的文件夹之外,打扰这个?(我还在应用程序的其他地方有一个message_en.properties,用于模板和UI的其他部分)

- 我该如何解决?

1 个答案:

答案 0 :(得分:2)

资源包的文件名必须完全与组件的文件名相同。

因此,如果您有一个代表复合组件的demoCustomComponent.xhtml文件,那么您应该有一个demoCustomComponent.properties文件,其中包含(默认)本地化消息。您可以使用例如demoCustomComponent_es.properties对其进行国际化,但您应该始终在路径中使用默认值。