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)
en fait, l'erreur est dans la classe ar.com.easytech.faces.test.homeBean, pouvez-vous montrer la fonction loadDataFromBean à l'intérieur? –
J'ai édité la question avec la méthode de la BB et le .xhtml – FMQ