我有一个超类Person:
Person
public class Person { public abstract Type getType(); }
我有它的 2 个子类:
public class JuridicalPerson extends Person { public Type getType() { return Type.JP; } public List<JuridicalBelong> getJuridicalBelongs() { return juridicalBelongs; } } public class NaturalPerson extends Person { public Type getType() { return Type.NP; } public List<NaturalBelong> getNaturalBelongs() { return naturalBelongs; } }
JuridicalBelong并且NaturalBelong具有不同的属性并且不能被子类化。
JuridicalBelong
NaturalBelong
我有它们List<Person>,我想在 JSF/Facelets 中展示如下:
List<Person>
<ui:repeat value="#{bean.persons}" var="person"> <h:panelGroup rendered="#{person.type eq 'JP'}"> <ui:repeat value="#{person.juridicalBelongs}" var="juridicalBelong"> ... </ui:repeat> </h:panelGroup> <h:panelGroup rendered="#{person.type eq 'NP'}"> <ui:repeat value="#{person.naturalBelongs}" var="naturalBelong"> ... </ui:repeat> </h:panelGroup> </ui:repeat>
但是,这会导致以下异常:
javax.el.PropertyNotFoundException:类“com.example.NaturalPerson”没有属性“juridicalBelongs”。
这怎么可能?根据我的rendered情况
rendered
<h:panelGroup rendered="#{person.type eq 'JP'}">
它应该忽略NaturalPerson,对吗?
NaturalPerson
这是由 Mojarra 的状态管理中的错误引起的,当您在其中使用EditableValueHolder组件(输入字段)时也会暴露该错误。这是根据问题 3219修复的。该修复程序在Mojarra 2.2.7和 JSF 2.0/2.1 中可用,根据issue 3224向后移植到Mojarra 2.1.29。所以至少升级到那个版本(或者只是根据Mojarra 主页提供的最新版本)应该可以做到。
否则,您最好的选择是替换为.