PropertyNotFoundException on conditionally rendered subclasses in ui:repeat
Asked Answered
P

2

5

I have a superclass Person:

public class Person {
    public abstract Type getType();
}

I have 2 subclasses of it:

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 and NaturalBelong have different properties and can't be subclassed.

I have them in a List<Person> which I'd like to present in JSF/Facelets as follows:

<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>

However, this causes the following exception:

javax.el.PropertyNotFoundException: The class 'com.example.NaturalPerson' does not have the property 'juridicalBelongs'.

How is this possible? As per my rendered condition

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

it should ignore NaturalPerson, right?

Paralipomena answered 31/8, 2014 at 16:48 Comment(0)
G
9

This is caused by a bug in state management of Mojarra's <ui:repeat> which will expose when you use EditableValueHolder components (input fields) inside the <ui:repeat> as well. This is fixed as per issue 3219. The fix is available in Mojarra 2.2.7 and for JSF 2.0/2.1 backported to Mojarra 2.1.29 as per issue 3224. So upgrading to at least that version (or just the latest available as per Mojarra homepage) should do it.

Otherwise, your best bet is to replace <ui:repeat> by <c:forEach>.

Gullah answered 31/8, 2014 at 18:39 Comment(1)
You always have the right answer! Thanks for sharing your knowledge @Gullah !!! :)Warnerwarning
B
0

In my case I didn't had the option to upgrade Mojarra's version and to avoid c:forEach (that causes many side-effects when used with ui optionally rendered components) I replaced ui:repeat with a p:dataList and it worked. You'll have to do some CSS styling to hide the bullets but I think it's worth the price. I hope it helps someone ;)

Bombardon answered 19/8, 2016 at 14:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.