2011-10-18 11 views
6

Sto imparando i componenti compositi con JSF 2.0 e voglio che il mio componente sia in grado di attivare metodi da backing bean, quindi ho creato un semplice esempio, ma qualcosa non va.Aggiunta di metodi di azione a un componente composito

Questo è il componente ho creato:

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

questo è come lo uso in una pagina 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> 

e questa è la backing bean che dà sostegno a la pagina in cui il 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; 
    } 
} 

Il componente sembra rendere bene, ma quando si preme il pulsante ottengo un'eccezione che dice:

javax.faces.FacesException: Impossibile risolvere componente composito da usando pagina utilizzando un'espressione EL '# {cc.attrs.actionMethod} '

Ho fatto errori nell'interfaccia o nell'implementazione del componente? Perché non funziona?

risposta

10

È definied il metodo dell'azione utilizzando nome dell'attributo actionBtn:

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

ma ci si aspetta che sia l'attributo del nome actionMethod:

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

allinearlo. Dovrebbero essere uguali.

+0

Ups, ora capisco, che stupido errore. Stavo guardando tutto il customComponent ma il mio errore era nell'indice.xhtml, ho appena scritto male il nome dell'attributo :) Grazie! – sfrj

Problemi correlati