2011-10-18 17 views
6

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?

Respuesta

10

Usted definied el método de acción utilizando el nombre del atributo actionBtn:

<custom:demoCustomComponent ... actionBtn="#{demoBB.act}"/> 

pero se está esperando que sea el nombre del atributo actionMethod:

<composite:attribute name="actionMethod" method-signature="java.lang.String action()"/> 

alinearlo. Deberían ser iguales.

+0

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

Cuestiones relacionadas