一尘不染

ui:repeat 中条件渲染子类的 PropertyNotFoundException

javascript

我有一个超类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,对吗?


阅读 69

收藏
2022-08-19

共1个答案

一尘不染

这是由 Mojarra 的状态管理中的错误引起的,当您在其中使用EditableValueHolder组件(输入字段)时也会暴露该错误。这是根据问题 3219修复的。该修复程序在Mojarra 2.2.7和 JSF 2.0/2.1 中可用,根据issue 3224向后移植到Mojarra 2.1.29。所以至少升级到那个版本(或者只是根据Mojarra 主页提供的最新版本)应该可以做到。

否则,您最好的选择是替换.

2022-08-19