2012-05-15 122 views
1

我在尝试访问某些带参数的属性时遇到一些麻烦。那么,我不知道他们是否应该被称为属性,因为访问器有参数,但现在让我们调用它们的属性。JSF 2.0和参数化EL表达式的问题

的情况是这样的:

我有一个包含不同的本地化作为一个地图对象一个学生类。我可以这样做,让这些本地化的对象:现在

student.getLocalizedData(String localizationCode); 

,在页面上,我试图做到这一点:

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

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

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

我知道,行是疯了,所以我试图把它包起来:

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

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

我找到的唯一解决方案是制作一个完全包装studen't sproperty的方法......但是这为每个本地化留下了2个方法(get + set),而且这仅仅是一个属性。这意味着我将结束拥有(2 x本地化x属性)数量的方法!

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

编辑:我使用JBoss 6.1.0.Final和随之而来JSF 2.0.3-B05 JSF实现

回答

2

这理论上应该工作,所以我怀疑的错误或疏忽使用的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}"/> 
+0

我要去的地图。至于实现,我使用的是JBoss 6.1.0.Final附带的JSF实现。这是问题的重要部分,对不起我跳过了它。 – Gamb

+0

EL没有与JSF impl绑定,而是绑定到servletcontainer impl,在你的情况下,因此JBoss 6.1.0(在封面下使用Apache EL,和Tomcat一样)。 – BalusC

+0

我不知道!地图选项仍然像一个魅力。谢谢你,兄弟!你摇滚! – Gamb

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>