use*_*609 4 jsf conditional el jsf-2 uirepeat
我有一个超类Person
:
public class Person {
public abstract Type getType();
}
Run Code Online (Sandbox Code Playgroud)
我有2个子类:
public class JuridicalPerson extends Person {
public Type getType() {
return Type.JP;
}
public List<JuridicalBelong> getJuridicalBelongs() {
return juridicalBelongs;
}
}
Run Code Online (Sandbox Code Playgroud)
public class NaturalPerson extends Person {
public Type getType() {
return Type.NP;
}
public List<NaturalBelong> getNaturalBelongs() {
return naturalBelongs;
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下异常:
javax.el.PropertyNotFoundException:类'com.example.NaturalPerson'没有属性'juridicalBelongs'.
这怎么可能?根据我的rendered
情况
<h:panelGroup rendered="#{person.type eq 'JP'}">
Run Code Online (Sandbox Code Playgroud)
它应该忽略NaturalPerson
吧?
这是由Mojarra的状态管理中的一个错误引起的<ui:repeat>
,当你EditableValueHolder
在内部使用组件(输入字段)时也会暴露这个错误<ui:repeat>
.这是根据问题3215修复的.解决方法是可用钻嘴鱼科2.2.7和JSF 2.0/2.1回迁到钻嘴鱼科2.1.29按发行3221.所以升级到至少那个版本(或者只是Mojarra主页上的最新版本)应该这样做.
否则,最好的办法是更换<ui:repeat>
的<c:forEach>
.