如何在JSF2 / EL 2.2中调用具有可选参数列表的方法

3

有什么方法(如果可能的话)可以从JSF页面调用具有可选参数的Java方法吗?我正在使用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')}"/>

Bean 示例

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

EL不支持可变参数。

关于您具体的功能需求,您的方法完全错误。您不应该在JSF中重新发明国际化/本地化,而应该使用JSF提供的设施。您应该在faces-config.xml中使用<resource-bundle>或在Facelets文件中使用<f:loadBundle>。这将使用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.propertiestext_de.properties等,符合ResourceBundle API规则。

另请参阅:


嗯...这只是一个例子(-: 我不喜欢像x+y=z这样的例子,所以我把它改成了国际化的例子...我的错。但是我必须说h:outputFormat听起来很好,我学到了新东西。 - Wooff
由于您已确认不支持可变参数,因此我只有三种方法来处理类似可变参数的调用,分别是带有一个/两个/三个参数的方法。虽然不太好看,但能够工作 )-: - Wooff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接