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

时间:2014-08-31 16:48:52

标签: jsf jsf-2 conditional el uirepeat

我有一个超类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;
    }
}

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>

但是,这会导致以下异常:

  

javax.el.PropertyNotFoundException:类'com.example.NaturalPerson'没有属性'juridicalBelongs'。

这怎么可能?根据我的rendered条件

<h:panelGroup rendered="#{person.type eq 'JP'}">

它应该忽略NaturalPerson,对吗?

2 个答案:

答案 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样式来隐藏子弹,但我认为这是值得的。 我希望它可以帮助某人;)