JSF MethodExpression javax.el.PropertyNotFoundException



我正在尝试开发一个自定义组件,该定制组件需要从BackingBean调用方法以从BB获取一些数据(这将在某个AJAX之后在解码阶段中调用带有一个参数的呼叫)(它将在Ajax调用中)。

我遇到的问题是我将属性定义为methodexpression(在taglibrary和component中),我获得了ajax帖子,解码参数,当我尝试从组件中获得方法绑定时,我得到的我得到了以下错误:

javax.el.propertynotfoundexception:/easyfaces.xhtml @19,151 dataSource ="#{thebean.loaddatafromsource}":类 'ar.com.easytech.faces.test.homebean'没有财产 'loaddatafrombean'。

这是相关的代码..(请让我知道这不是正确的方法。)

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>

组件定义:

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}" />

问题是,如果我定义了一个方法getautocoptetefromsource(),它识别了该方法,并且错误更改为无法将列表转换为methodexpression,因此显然,它只是将autococteeteTretefromsource解释为简单属性,而不是方法定义,而不是方法这甚至是从BB调用方法的正确方法?(给出这不是实际的动作,也不是验证)

我找到了解决方案,因为事实证明您还需要定义"处理程序"来定义方法签名,因此我创建了处理程序并添加到了Taglib,并且一切启动了正常工作..供参考..这是处理程序..

问候

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;
    }
}

相关内容

  • 没有找到相关文章

最新更新