3

any idea how (if even possible) to call java method with optional parameters from JSF page? Iam using Java 7,JSF 2.1, EL 2.2 (Glassfish 3.1.2). Thanks in advance...

I got this exception

javax.el.ELException: /example.xhtml: wrong number of arguments
Caused by: java.lang.IllegalArgumentException: wrong number of arguments

Page example

<h:outputText value="#{bean.methodWithParameters('key.en.currentDate', '2012-01-01', '00:00')}"/>
<h:outputText value="#{bean.methodWithParameters('key.en.currentTime', '12:00')}"/>

Bean example

public String methodWithParameters(String key, Object ... params) {
    String langValue = LanguageBean.translate(key);
    return String.format(langValue, params);
}

Properties example

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.
Wooff
  • 1,091
  • 12
  • 23

1 Answers1

5

Varargs is not supported in EL.

As to your concrete functional requirement, you're approaching this totally wrong. You should not reinvent internationalization/localization in JSF, but instead use the JSF-provided facilities. You should be using <resource-bundle> in faces-config.xml or <f:loadBundle> in Facelets file for this. This will load the files by ResourceBundle API and use the MessageFormat API to format the messages. You can then format the strings by <h:outputFormat> with <f:param>.

E.g. com/example/i18n/text.properties

key.en.currentDate=Today is {0} and current time is {1}.
key.en.currentTime=Current time is {0}.

View:

<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>

Further I'm not sure if that en in the key stands for English or not, but if it indeed stands for the language, then you're making another mistake. The separate languages needs to have each its own properties file like text_en.properties, text_de.properties, etc conform ResourceBundle API rules.

See also:

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • ehm... it was only example (-: I do not like examples like x+y=z so I shape it to internationalization example... my mistake. But I have to say that h:outputFormat sounds good and I just learned something new. – Wooff Mar 28 '12 at 05:39
  • Since varargs are not supported (confirmed by you), I just have three methods with one/two/three parameters to handle varargs like calls. Not nice but work )-: – Wooff Mar 28 '12 at 05:43