Estoy aprendiendo acerca de los componentes compuestos con JSF 2.0 y quiero que mi componente pueda desencadenar métodos de respaldo de beans, así que creé un ejemplo simple, pero algo está mal.Agregar métodos de acción a un componente compuesto
Este es el componente que he creado:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="attribute1"/>
<composite:attribute name="attribute2"/>
<composite:attribute name="actionBtnText"/>
<composite:attribute name="actionMethod" method-signature="java.lang.String action()"/>
</composite:interface>
<composite:implementation>
<h:form>
<h:inputText value="#{cc.attrs.attribute1}"/>
<br/>
<h:inputText value="#{cc.attrs.attribute2}"/>
<br/>
<h:commandButton action="#{cc.attrs.actionMethod}" value="#{cc.attrs.actionBtnText}"/>
</h:form>
</composite:implementation>
</html>
Así es como yo lo uso en una página JSF
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:custom="http://java.sun.com/jsf/composite/custom">
...
<h:body>
<custom:demoCustomComponent attribute1="#{demoBB.value1 }" attribute2="#{demoBB.value2 }" actionBtnText="Button text!" actionBtn="#{demoBB.act}"/>
</h:body>
y este es el bean de respaldo que da apoyo a la página donde está el componente
@Named("demoBB")
@RequestScoped
public class DemoBB {
private String value1;
private String value2;
public String getValue1() {
return value1;
}
public String act() {
System.out.println("Input 1: " + value1 + "\nInput 2: " + value2);
return null;
}
//Getters and setters
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}
}
El componente parece rendir bien, pero cuando se presiona el botón i obtener una excepción que dice:
javax.faces.FacesException: No se puede resolver componente compuesto de utilizando la página utilizando la expresión EL '# {cc.attrs.actionMethod} '
¿Cometí algún error en la interfaz o implementación del componente? ¿Por qué no funciona?
Ups, ahora veo, qué error tan tonto. Estuve todo el tiempo mirando el componente personalizado pero mi error estaba en el index.xhtml, escribí mal el nombre del atributo :) ¡Gracias! – sfrj