我在尝试使用参数访问某些属性时遇到了一些麻烦。好吧,我不知道它们是否应该被称为属性,因为访问器具有参数但是现在让它们称为属性。
情况如下:
我有一个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
答案 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>