我想开发将需要从backingbean调用一个方法来从BB得到一些数据(这将在一定Ajax调用后的解码阶段被称为)有一个参数的自定义组件(它会在AJAX调用)。
我遇到的问题是,我定义属性作为MethodExpression的(在标记库和组件),我得到了阿贾克斯后,解码参数,当我试图让的方法从我得到以下错误的组件绑定:
javax.el.PropertyNotFoundException:/easyFaces.xhtml @ 19151数据源= “#{} theBean.loadDataFromSource”:类 'ar.com.easytech.faces.test.homeBean' 没有财产 'loadDataFromBean'。
下面是相关的代码。(并请让我知道这是不是这样做的正确方法。)
标签库:
<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>
组件定义:
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);
}
最后所呈现的方法生成错误:
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;
}
下面是从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;
}
与组分的.xhtml
<et:autocomplete id="autoc" minLength="3" delay="500" value="#{easyfacesBean.selectedValue}" dataSource="#{easyfacesBean.autcompleteFromSource}" />
问题是,如果我定义一个方法getAutocompleteFromSource()它认可的方法和错误的更改列表不能转换为MethodExpression的左右,显然它只是解释autocompleteFromSource作为一个简单的属性,而不是方法定义,这是连正确的方法从BB调用的方法? (给,这不是一个实际的行动,也没有验证)