index example jsf jsf-2 conditional el uirepeat

jsf - example - PropertyNotFoundException en subclases condicionalmente renderizadas en ui: repeat



repeat primefaces example (2)

Esto es causado por un error en la gestión del estado de <ui:repeat> de Mojarra que se expondrá cuando utilice los componentes EditableValueHolder (campos de entrada) dentro de <ui:repeat> también. Esto se soluciona de acuerdo con el número 3215 . La solución está disponible en Mojarra 2.2.7 y para JSF 2.0 / 2.1 backported a Mojarra 2.1.29 según el número 3221 . Por lo tanto, la actualización a al menos esa versión (o simplemente la última disponible según la página de inicio de Mojarra ) debería hacerlo.

De lo contrario, su mejor opción es reemplazar <ui:repeat> por <c:forEach> .

Tengo una Person superclase:

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

Tengo 2 subclases:

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 y NaturalBelong tienen diferentes propiedades y no se pueden subclasificar.

Los tengo en una List<Person> que me gustaría presentar en JSF / Facelets de la siguiente manera:

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

Sin embargo, esto causa la siguiente excepción:

javax.el.PropertyNotFoundException: la clase ''com.example.NaturalPerson'' no tiene la propiedad ''juridicalBelongs''.

¿Cómo es esto posible? Según mi condición rendered

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

debería ignorar NaturalPerson , ¿verdad?


En mi caso, no tuve la opción de actualizar la versión de Mojarra y evitar c: forEach (que causa muchos efectos secundarios cuando se usa con componentes renderizados opcionalmente). Reemplacé ui: repeat con ap: dataList y funcionó. Tendrás que hacer un poco de estilo de CSS para ocultar las viñetas, pero creo que vale la pena el precio. Espero que esto ayude a alguien ;)