Tengo construir un componente personalizado en JSF 2.0JSF 2 componentes personalizados que tienen lenguaje de expresión para el valor del atributo no activan el colocador atributo
La etiqueta se ve así:
<x:myTag id="1" name="AAA" />
la clase Java correspondiente :
@FacesComponent("a.b.c.MyTag")
public class UIMyTag extends UIInput {
private String name;
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
logger.debug(getName()); //prints null for name="#{dummyBean.name}"
// and AAA for name="AAA"
logger.debug(getAttributes().get("name")); // always correct value
...
}
....
}
Si uso
<x:myTag id="1" name="AAA" />
todo funciona como se esperaba, pero cuando uso EL para los atributos myTag el método setName()
nunca se llama. Así que para,
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
Siempre me null
para la propiedad name
dentro de mi método encodeBegin
. Después de la depuración, me he dado cuenta de que nunca se llama al método setName
. Pensé que tal vez algo relacionado con EL estropea las cosas (y sigo creyendo que la razón está relacionada con eso), pero lo que es realmente extraño es que la propiedad id
funciona bien: se llama al colocador y el valor es el esperado cuando el proceso comienza.
Tengo que mencionar que si llamo al getAttributes().get("name")
desde el método encodeBegin
, obtengo el valor de nombre correcto, pero estoy intrigado porque no funciona con getter y setter.
¿Alguna idea de lo que falta en mi componente?
¡Gracias por la respuesta! Me gustaría preguntar si tengo que implementar algún método especial para distinguir entre diferentes tipos de valores de atributos dentro de mi componente. (Entendí que UIComponentBase lo maneja por sí mismo) Y si es así, ¿existe una mejor práctica para hacerlo? – RaresI
No y en general tampoco debería preocuparse por eso.Para obtener el valor del atributo (evaluado), solo invoque el getter. – BalusC