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