我正在尝试开发一个自定义组件,它将需要从backingbean调用一个方法,以便从bb获得一些数据(在某个Ajax调用之后在解码阶段调用),其中包含一个参数(它将出现在ajax调用中)。
我遇到的问题是,我将属性定义为MethodExpression (在标签库和组件中),得到Ajax,对参数进行解码,当我试图从组件获得绑定方法时,会得到以下错误:
javax.el.PropertyNotFoundException: /easyFaces.xhtml @19,151 dataSource="#{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(),它会识别该方法,并且错误更改为无法将list转换为MethodExpression,所以很明显,它只是将autocompleteFromSource解释为一个简单的属性,而不是一个方法定义,这是否是从BB调用方法的正确方式?(考虑到这不是一个实际的行动或验证)
发布于 2012-11-12 14:25:57
我找到了这个问题的解决方案,因为您还需要定义一个“handler”来定义方法签名,所以我创建了处理程序并添加到taglib中,所有东西都开始运行fine..just以供参考。这是处理程序..。
问候
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;
}
}https://stackoverflow.com/questions/13326768
复制相似问题