Как вызвать метод с необязательным списком параметров в JSF2 / EL 2.2
Любая идея, как (если даже возможно), чтобы вызвать метод Java с необязательными параметрами со страницы JSF? Я использую Java 7,JSF 2.1, EL 2.2 (Glassfish 3.1.2). Заранее спасибо...
Я получил это исключение
javax.el.ELException: /example.xhtml: wrong number of arguments
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
Пример страницы
<h:outputText value="#{bean.methodWithParameters('key.en.currentDate', '2012-01-01', '00:00')}"/>
<h:outputText value="#{bean.methodWithParameters('key.en.currentTime', '12:00')}"/>
Пример бина
public String methodWithParameters(String key, Object ... params) {
String langValue = LanguageBean.translate(key);
return String.format(langValue, params);
}
Пример свойств
key.en.currentDate=Today is %s and current time is %s.
key.en.currentTime=Current time is %s.
key.en.currentDate=Today is %1$s and current time is %2$s.
key.en.currentTime=Current time is %2$s.
1 ответ
Varargs не поддерживается в EL.
Что касается вашего конкретного функционального требования, вы подходите к этому совершенно неправильно. Не следует заново изобретать интернационализацию / локализацию в JSF, вместо этого следует использовать средства, предоставляемые JSF. Вы должны использовать <resource-bundle>
в faces-config.xml
или же <f:loadBundle>
в файле Facelets для этого. Это загрузит файлы ResourceBundle
API и использовать MessageFormat
API для форматирования сообщений. Затем вы можете отформатировать строки <h:outputFormat>
с <f:param>
,
Например com/example/i18n/text.properties
key.en.currentDate=Today is {0} and current time is {1}.
key.en.currentTime=Current time is {0}.
Посмотреть:
<f:loadBundle baseName="com.example.i18n.text" var="text" />
<h:outputFormat value="#{text['key.en.currentDate']}">
<f:param value="2012-01-01" />
<f:param value="00:00" />
</h:outputFormat>
Далее я не уверен, что это en
в ключе обозначает английский или нет, но если он действительно обозначает язык, то вы совершаете еще одну ошибку. Отдельные языки должны иметь каждый свой properties
файл как text_en.properties
, text_de.properties
и т. д. соответствуют ResourceBundle
Правила API.