我目前正在开发一个最近从 JSF 1.2 移植到 JSF 2(Mojarra 2.1.21 + Seam 2.3)的应用程序。
有一页有很多类似的结构(这不是确切的语法,我知道 EL 不会以这种形式编译):
<s:fragment rendered="aModel.typeAbc eq 'ABC'">
<ui:include src="...xhtml"/>
</s:fragment>
<s:fragment rendered="aModel.type123 eq '123'">
<ui:include src="...xhtml"/>
</s:fragment>
由于仅包含 1 页中的表达式评估结果。表达式总是使用模型(让我们调用实例“aModel”)来创建布尔表达式。问题是“aModel”可以是 Model 类或其任何子类的实例。更进一步——任何表达式都可以使用仅对特定 sublass 实例可用的值(getter):
- 模型有方法 getType()
- ModelAbc 有方法 getTypeAbc()
- Model123 有方法 getType123()
这会导致当重复使用同一页面来显示不同类型模型的详细信息时,会导致所有的执行并将其内容插入到 UI 树中。
然后,在状态保存期间,我得到 PropertyNotFoundException,因为当前的“aModel”(假设它是 Model123 类型)没有方法“getTypeAbc”。
编辑1:
在状态保存期间解析的 EL 值是“ui:repeat”中使用的值。
现在真正的问题是:
- 这是在这里使用的正确解决方案吗?
- 是否可以完全禁用 1 个特定页面的状态保存?
- 是否可以从后端以编程方式清除此类 Page 的状态?
- JSF2 是否总是保存未呈现控件的状态?
- 任何想法如何解决这个问题?
编辑 2。
BalusC 已经给出了答案(以及 2-3 条评论),但我现在看不到它。有人删了吗?!如果是这样,为什么没有迹象?