2013-08-08 2 views
2

У меня возникли проблемы с локализацией составного компонента (Mojarra 2.2, Glassfish 4.0).Как локализовать композитный компонент JSF?

Я попытался решением 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/Aug/12 03:50 PM), что JSF локализуется иначе, чем стандартная Java, и что файлы свойств будут идти в resources/en/<library>/<component>.properties, поэтому я поставил там mycomp.properties и снова получил ошибку.

Мой стандарт по умолчанию на самом деле «en_US» - я тоже пробовал это с теми же результатами.

Таким образом, это работает:
resources/lib/mycomp.xhtml, resources/lib/mycomp.properties

Они не работают:
resources/lib/mycomp.xhtml, resources/lib/mycomp_en.properties
resources/lib/mycomp.xhtml, resources/en/lib/mycomp.properties

Что я делаю неправильно?

ответ

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.properties, MyComposite_en.properties, и т. д. в том же пакете com.example.composite. Это сработало для меня.

+0

Я пробовал эту работу, но получаю ту же ошибку. Я проверил, что компонент компонента backing создается (так, предположительно, он правильно связан с составным компонентом), но все равно получает исключение NullPointerException при попытке получить строку с '# {cc.resourceBundleMap.title}'. Может ли быть что-то еще, что мне нужно сделать? Я определил '' в 'faces-config.xml' для использования для локальной локализации приложения - может быть, это осложняет ситуацию? если я ссылаюсь на этот пакет в составном компоненте, он работает, так что это может быть достаточно для работы, я полагаю. – CraftWeaver

Смежные вопросы