JSF 2.0和参数化EL表达式的问题

时间:2012-05-15 20:04:07

标签: java jsf-2 el

我在尝试使用参数访问某些属性时遇到了一些麻烦。好吧,我不知道它们是否应该被称为属性,因为访问器具有参数但是现在让它们称为属性。

情况如下:

我有一个Student类,它包含不同的本地化作为地图中的对象。我可以通过这样做获得这些本地化对象:

student.getLocalizedData(String localizationCode);

现在,在页面上,我正在尝试这样做:

<h:inputText value="#{collegeBean.student.getLocalizedData('es').profileDescription}"/>

学生的描述可以有很多本地化。

页面加载正确,但是当我尝试保存学生时,它表示bean collegeBean没有属性getLocalizedData,但是那个是bean上包含的学生的属性很难。

我知道这条线是疯了,所以我试着把它包起来:

<h:inputText value="#{collegeBean.getStudentLocalizedData('es').profileDescription}"/>

唉,我再次得到同样的信息。

我发现的唯一解决方案就是制作一个完全包裹着学习的方法......但是这为我的每个本地化提供了2种方法(get + set),而且只有一种属性。这意味着我将结束(2个本地化x属性)数量的方法!。

我能以最动态的方式解决这个问题吗?本地化的大量未来可能会发生变化,我不想更改任何代码。

编辑:我正在使用JBoss 6.1.0.Final及其附带的JSF实现JSF 2.0.3-b05

2 个答案:

答案 0 :(得分:2)

理论上这应该有效,所以我怀疑使用的EL实现中存在错误或疏忽。您可能想尝试不同的EL实现(不同的服务器make)或升级服务器。如果徒劳无功,请将其作为错误报告给服务器供应商。

但是,由于您实际上是将getLocalizedData()委托给Map,因此最好不要这样做,而是直接返回整个Map

public Map<String, LocalizedData> getLocalizedData() {
    return localizedData;
}

以便您可以按如下方式使用

<h:inputText value="#{collegeBean.student.localizedData.es.profileDescription}"/>

或者,如果需要,

<h:inputText value="#{collegeBean.student.localizedData['es'].profileDescription}"/>

答案 1 :(得分:1)

根据我的经验,大多数接受参数的EL实现都是以某种方式出错。我最满意的是Tomcat 7的EL。

请注意,您可以使用Mojarra和MyFaces的自定义EL实现。我通常将Tomcat与我的应用程序捆绑在一起,因此我可以信赖一个稳定的功能集。但是你必须小心,因为如果你没有正确配置所有内容,就会遇到类加载器问题。

钻嘴鱼科:

<context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>YOUR EL IMPLEMENTATION EXPRESSION FACTORY</param-value>
</context-param>

MyFaces的:

<context-param>
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>YOUR EL IMPLEMENTATION EXPRESSION FACTORY</param-value>
</context-param>