如何本地化JSF复合组件?

时间:2013-08-08 19:24:03

标签: jsf localization composite-component

我无法本地化复合组件(Mojarra 2.2,Glassfish 4.0)。

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

但是当我想本地化字符串时(通过在属性文件的文件名中添加_en后缀)我得到了这个错误(只改变了属性文件的名称):

[2013-08-08T13:49:04.234-0500] [glassfish 4.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=24 _ThreadName=http-listener-1(5)] [timeMillis: 1375987744234] [levelValue: 900] [[
  StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at javax.faces.component.UIComponent.findComponentResourceBundleLocaleMatch(UIComponent.java:1204)
at javax.faces.component.UIComponent.getResourceBundleMap(UIComponent.java:1007)
at sun.reflect.GeneratedMethodAccessor1226.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:363)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at com.sun.el.parser.AstValue.getValue(AstValue.java:140)
at com.sun.el.parser.AstValue.getValue(AstValue.java:204)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:227)
at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:115)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)

...

我读了article(发布于24/8月12日下午12:50),JSF本地化的方式与标准Java不同,属性文件将放在resources/en/<library>/<component>.properties中,所以我放{{ 1}}然后再次出错。

我的默认语言环境实际上是“en_US” - 我也试过了同样的结果。

所以,这有效:
mycomp.propertiesresources/lib/mycomp.xhtml

这些不起作用:
resources/lib/mycomp.propertiesresources/lib/mycomp.xhtml
resources/lib/mycomp_en.propertiesresources/lib/mycomp.xhtml

我做错了什么?

1 个答案:

答案 0 :(得分:2)

我可以重现你的问题。这非常令人尴尬。显然,在较新的Mojarra版本中,与此相关的内容发生了变化。我无法在2.2.0中同时使用旧方法和新方法。

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

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

package com.example.composite;

@FacesComponent("myComposite")
public class MyComposite extends UINamingContainer {
    // Can be kept empty.
}

并在复合组件定义中声明它:

<cc:interface componentType="myComposite">

然后,您可以简单地将MyComposite.propertiesMyComposite_en.properties等放在同一个com.example.composite包中。它对我有用。