我有一个超类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
具有不同的属性,无法进行子类化。
我将它们放在List<Person>
中,我想在JSF / Facelets中呈现如下:
<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
条件
<h:panelGroup rendered="#{person.type eq 'JP'}">
它应该忽略NaturalPerson
,对吗?
答案 0 :(得分:6)
这是由Mojarra的<ui:repeat>
状态管理中的错误引起的,当您在EditableValueHolder
内使用<ui:repeat>
组件(输入字段)时,该错误将会暴露出来。这是根据issue 3215修复的。该修复程序在Mojarra 2.2.7中可用,而JSF 2.0 / 2.1则按Mojarra 2.1.29向后移植到issue 3221。因此,至少升级到该版本(或根据Mojarra homepage只提供最新版本)应该这样做。
否则,您最好的选择是将<ui:repeat>
替换为<c:forEach>
。
答案 1 :(得分:0)
在我的情况下,我没有选择升级Mojarra的版本并避免使用c:forEach(当与ui可选渲染组件一起使用时会产生许多副作用)我替换了ui:使用ap:dataList重复它并且它有效。 你必须做一些CSS样式来隐藏子弹,但我认为这是值得的。 我希望它可以帮助某人;)