JSF MethodExpression javax.el.PropertyNotFoundException
Próbuję opracować niestandardowy komponent, który będzie musiał wywołać metodę z bazy backingbean, aby uzyskać pewne dane z bb (zostanie to wywołane w fazie dekodowania po pewnym wywołaniu Ajax) z jednym parametrem (przyjdzie w wywołanie ajax).
Mam problem jest to, że zdefiniuję atrybut jako MethodExpression (w taglibrary i komponencie), otrzymuję post Ajax, dekoduję parametr i kiedy próbuję uzyskać powiązanie metody z komponentu, otrzymuję następujący błąd :
javax.el.PropertyNotFoundException: /easyFaces.xhtml @ 19,151 dataSource = "# {theBean.loadDataFromSource}": Klasa „ar.com.easytech.faces.test.homeBean” nie ma właściwości „loadDataFromBean”.
Oto odpowiedni kod .. (i daj mi znać, jeśli nie jest to właściwy sposób na zrobienie tego ..)
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>
Definicja komponentu:
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);
}
i wreszcie metoda renderowana, która generuje błąd:
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;
}
Oto metoda z 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;
}
I .xhtml z komponentem
<et:autocomplete id="autoc" minLength="3" delay="500" value="#{easyfacesBean.selectedValue}" dataSource="#{easyfacesBean.autcompleteFromSource}" />
Chodzi o to, że jeśli zdefiniuję metodę getAutocompleteFromSource (), rozpozna ona metodę i zmiany błędów w liście nie do konwersji na MethodExpression, więc najwyraźniej po prostu interpretuje autocompleteFromSource jako prostą właściwość, a nie definicję metody, czy to jest nawet poprawny sposób wywołania metody z BB? (podając, że nie jest to rzeczywiste działanie ani walidacja)