如何本地化JSF复合组件?

如何本地化JSF复合组件?,jsf,localization,composite-component,Jsf,Localization,Composite Component,我在定位复合组件(Mojarra 2.2、Glassfish 4.0)时遇到问题 我尝试了BalusC的解决方案,将属性文件放在与复合组件相同的目录中,该目录具有与复合组件相同的文件名和一个.properties扩展名,该扩展名用于将复合组件定义中的字符串外部化 但是当我想本地化字符串(通过向属性文件的文件名添加\u en后缀)时,我得到了这个错误(唯一改变的是属性文件的名称): 我读了一篇文章(从2008年8月24日下午3:50)说JSF的本地化与标准Java不同,属性文件将放在resourc

我在定位复合组件(Mojarra 2.2、Glassfish 4.0)时遇到问题

我尝试了BalusC的解决方案,将属性文件放在与复合组件相同的目录中,该目录具有与复合组件相同的文件名和一个
.properties
扩展名,该扩展名用于将复合组件定义中的字符串外部化

但是当我想本地化字符串(通过向属性文件的文件名添加
\u en
后缀)时,我得到了这个错误(唯一改变的是属性文件的名称):

我读了一篇文章(从2008年8月24日下午3:50)说JSF的本地化与标准Java不同,属性文件将放在
resources/en//.properties
中,所以我把
mycomp.properties
放在那里,再次得到错误

我的默认区域设置实际上是“en_US”——我也尝试过,但结果相同

因此,这是有效的:
resources/lib/mycomp.xhtml
resources/lib/mycomp.properties

这些不起作用:
resources/lib/mycomp.xhtml
resources/lib/mycomp\u en.properties

resources/lib/mycomp.xhtml
resources/en/lib/mycomp.properties


我做错了什么?

我可以重现你的问题。这很尴尬。很明显,在新的Mojarra版本中,与此相关的某些内容发生了变化。我无法在2.2.0中同时使用新旧方法

我再次查看了Mojarra源代码,从开始,我了解到资源包首先是基于组件类的FQN进行搜索的。我们可以很容易地利用它

如果尚未完成,请首先创建支持组件类:

package com.example.composite;

@FacesComponent("myComposite")
public class MyComposite extends UINamingContainer {
    // Can be kept empty.
}
并在复合组件定义中声明:

<cc:interface componentType="myComposite">


然后,您可以简单地将
MyComposite.properties
MyComposite\u en.properties
等放在相同的
com.example.composite
包中。这对我来说很有效。

我试着解决了这个问题,但得到了同样的错误。我验证了正在实例化支持组件类(因此,假定它与复合组件正确关联),但在尝试使用
#{cc.resourceBundleMap.title}
获取字符串时,仍然会获取NullPointerException。还有什么我需要做的吗?我在
faces config.xml
中定义了一个
用于应用程序范围的本地化--这会使事情变得复杂吗?如果我在复合组件中引用这个包,它就可以工作了,所以我想这就足够了。
<cc:interface componentType="myComposite">