【问题标题】:Problems with JSF 2.0 and parametrized EL ExpressionsJSF 2.0 和参数化 EL 表达式的问题
【发布时间】:2012-05-23 09:26:17
【问题描述】:

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

情况是这样的:

我有一个 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 2.0.3-b05 附带的 JSF 实现

【问题讨论】:

    标签: java jsf-2 el


    【解决方案1】:

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

    但是,由于您实际上是将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}"/>
    

    【讨论】:

    • 我要去拿地图。至于实现,我使用的是 JBoss 6.1.0.Final 附带的 JSF 实现。这是问题的重要部分,抱歉我跳过了。
    • EL 与 JSF impl 无关,而是与 servletcontainer impl 相关,在您的情况下就是 JBoss 6.1.0(在幕后使用 Apache EL,Tomcat 也有)。跨度>
    • 我不知道!地图选项仍然像一个魅力。谢谢你,兄弟!你摇滚!。
    【解决方案2】:

    根据我的经验,大多数接受参数的 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>
    

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2017-07-18
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      相关资源
      最近更新 更多