2012-11-10 1 views
2

J'essaye de développer un composant personnalisé qui devra appeler une méthode du backingbean pour obtenir des données du bb (cela sera appelé dans la phase de décodage après un certain appel Ajax) avec un paramètre (il viendra dans l'appel ajax). Le problème que j'ai est que je définis l'attribut en tant que MethodExpression (dans la taglibrary et le composant), j'obtiens l'Ajax post, décode le paramètre et quand j'essaye d'obtenir la méthode de liaison du composant I l'erreur suivante:JSF MethodExpression javax.el.PropertyNotFoundException

javax.el.PropertyNotFoundException: /easyFaces.xhtml @19,151 dataSource="#{theBean.loadDataFromSource}": The class 'ar.com.easytech.faces.test.homeBean' does not have the property 'loadDataFromBean'.

Voici le code correspondant .. (et s'il vous plaît laissez-moi savoir si ce n'est pas la bonne façon de le faire ..)

taglib:

<attribute> 
    <display-name>Data Source</display-name> 
    <name>dataSource</name> 
    <required>true</required> 
    <type>javax.el.MethodExpression</type> 
    <method-signature>java.util.List theDataSource(java.lang.String)</method-signature> 
</attribute> 

Définition du composant:

public class Autocomplete extends HtmlInputText implements ClientBehaviorHolder 
... 
    public MethodExpression getDataSource() { 
     return (MethodExpression) getStateHelper().eval(PropertyKeys.dataSource); 
    } 

    public void setDataSource(MethodExpression dataSource) { 
     getStateHelper().put(PropertyKeys.dataSource, dataSource); 
    } 

et enfin la méthode rendu qui génère l'erreur:

private List<Object> getData(FacesContext context, Autocomplete autocomplete, String data) { 

    Object dataObject = null; 
    MethodExpression dataSource = autocomplete.getDataSource(); 

    if (dataSource != null) { 
     try { 
      dataObject = dataSource.invoke(context.getELContext(), new Object[] {data}); 
      return convertToList(dataObject); 
     } catch (MethodNotFoundException e) { 
      logger.log(Level.INFO,"Method not found: {0}", dataSource.getExpressionString()); 

     } 
    } 
    return null; 

} 

est la méthode ici de la BB

public List<String> autcompleteFromSource(String param) { 

    List<String> tmpData = new ArrayList<String>(); 
    tmpData.add("XXA_TABLE_A"); 
    tmpData.add("XXA_TABLE_B"); 
    tmpData.add("XXA_TABLE_C"); 

    return tmpData; 
} 

Et le .xhtml avec le composant

<et:autocomplete id="autoc" minLength="3" delay="500" value="#{easyfacesBean.selectedValue}" dataSource="#{easyfacesBean.autcompleteFromSource}" /> 

La chose est si je définis une méthode getAutocompleteFromSource() il a reconnu la méthode et l'erreur change à ne peut pas convertir la liste en MethodExpression, donc évidemment il interprète simplement l'autocompleteFromSource comme une propriété simple et pas une définition de méthode, est-ce même la bonne façon d'appeler la méthode de BB? (donnant que ce n'est pas une action réelle ni validation)

+0

en fait, l'erreur est dans la classe ar.com.easytech.faces.test.homeBean, pouvez-vous montrer la fonction loadDataFromBean à l'intérieur? –

+1

J'ai édité la question avec la méthode de la BB et le .xhtml – FMQ

Répondre

2

J'ai trouvé la solution pour cela, car il s'avère que vous devez également définir un "gestionnaire" pour définir la signature de la méthode, j'ai donc créé le gestionnaire et ajouté à la taglib et tout a commencé à travailler fine..just pour référence .. voici le gestionnaire ..

Cordialement

public class AutocompleteHandler extends ComponentHandler { 

    public AutocompleteHandler(ComponentConfig config) { 
     super(config); 
    } 

    protected MetaRuleset createMetaRuleset(Class type) { 
     MetaRuleset metaRuleset = super.createMetaRuleset(type); 
     metaRuleset.addRule(new MethodRule("dataSource", List.class, new Class[] { String.class })); 
     return metaRuleset; 
    } 

} 
+0

s'il vous plaît accepter votre réponse comme 'résolu – DanielK

Questions connexes