Как вызвать метод с необязательным списком параметров в JSF2 / EL 2.2 - PullRequest
3 голосов
/ 27 марта 2012

Есть идеи, как (если возможно) вызвать метод 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 Ответ

5 голосов
/ 27 марта 2012

Varargs не поддерживается в EL.

Что касается вашего конкретного функционального требования, вы подходите к этому совершенно неправильно. Не следует заново изобретать интернационализацию / локализацию в JSF, вместо этого следует использовать средства, предоставляемые JSF. Для этого вы должны использовать <resource-bundle> в faces-config.xml или <f:loadBundle> в файле Facelets. Это загрузит файлы с помощью API ResourceBundle и использует API MessageFormat для форматирования сообщений. Затем вы можете отформатировать строки как <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.

Смотри также:

...