java - texto - Componente personalizado JSF: soporte para argumentos de tipos personalizados, el setter de atributos nunca se invoca
tipos de argumentacion pdf (1)
Esto no tiene nada que ver con los tipos personalizados. Esto tiene que ver con el uso de valores literales (estáticos) contra EL como en attributename="attributevalue"
versus attributename="#{attribute.value}"
.
Este comportamiento es esperado y por especificación. Los valores de atributo que son expresiones EL ( ValueExpression
s) han sido establecidos por UIComponent#setValueExpression()
. Se supone que deben evaluarse solo cuando realmente se solicitan, generalmente durante el tiempo de visualización. No deberían evaluarse directamente durante la cocción de la instancia de UIComponent
ya que eso vencería la naturaleza de las expresiones de valores dinámicos (pensemos en depender de la ronda de iteración actual de la tabla de datos).
Mejor es delegar los getters / setters de atributos que pueden contener una expresión de valor EL a UIComponent#getStateHelper()
lugar de a las propiedades locales. El setValueExpression()
finalmente también terminará en el StateHelper
. El UIComponent#getAttributes()
también resuelve los valores de StateHelper
.
public Image getImage() {
return (Image) getStateHelper().eval("image");
}
public void setImage(Image image) {
getStateHelper().put("image", image);
}
Tenga en cuenta que no hay propiedad local. Entonces, cuando necesite el valor (evaluado) del atributo, simplemente llame al getter.
Para lograr su requisito funcional inicial, que es el registro del atributo de conjunto, es posible que desee agregar la declaración de registro a la setValueExpression()
que delegue en super
.
@Override
public void setValueExpression(String name, ValueExpression binding) {
log.debug(....);
super.setValueExpression(name, binding);
}
Creé mi componente JSF personalizado de acuerdo con uno de los muchos tutoriales (estoy usando PrimeFaces ), agregué un argumento que se pasó con éxito al componente.
<c:custom command="command"/>
public void setCommand(String command) {
log.debug("setCommand {}", command);
this.command = command;
}
Pero necesito el argumento del tipo personalizado, y eso es algo que no pude encontrar en los tutoriales, que manejan solo los casos más triviales.
<c:custom image="#{currentImageBean.image}"/>
public void setImage(Object image) {
log.debug("setImage {}", image);
this.image = (Image) image;
}
El bean devuelve el objeto de tipo Image , pero no se llama al setter. He esperado que esto funcione, porque de lo contrario un buen tutorial debería mencionar ese caso, pero ahora estoy atascado con el peor de los errores: no pasa nada, y no hay nada en los registros que sugiera por qué ... Entonces, ¿qué está mal? , ¿qué necesito cambiar, dónde buscar un posible error?