有关在ui:repeat中呈现的子类的PropertyNotFoundException

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)

JuridicalBelongNaturalBelong具有不同的属性,不能被子类化.

我将它们放在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吧?

Bal*_*usC 6

这是由Mojarra的状态管理中的一个错误引起的<ui:repeat>,当你EditableValueHolder在内部使用组件(输入字段)时也会暴露这个错误<ui:repeat>.这是根据问题3215修复的.解决方法是可用钻嘴鱼科2.2.7和JSF 2.0/2.1回迁到钻嘴鱼科2.1.29发行3221.所以升级到至少那个版本(或者只是Mojarra主页上的最新版本)应该这样做.

否则,最好的办法是更换<ui:repeat><c:forEach>.

  • 你总能得到正确的答案!感谢您分享您的知识@BalusC !!! :) (2认同)