1

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

情况是这样的:

我有一个 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 本地化 x 属性)数量的方法!。

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

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

4

2 回答 2

2

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

但是,由于您实际上是将 a 委托getLocalizedData()给 a 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}"/>
于 2012-05-15T20:09:35.860 回答
1

以我的经验,大多数接受参数的 EL 实现都以一种或另一种方式存在缺陷。我最满意的是Tomcat 7 的EL。

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

莫哈拉:

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

我的脸:

<context-param>
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>YOUR EL IMPLEMENTATION EXPRESSION FACTORY</param-value>
</context-param>
于 2012-05-15T20:23:26.337 回答