JSF MethodExpression的javax.el.PropertyNotFoundExce

2019-08-02 14:32发布

我想开发将需要从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调用的方法? (给,这不是一个实际的行动,也没有验证)

Answer 1:

我发现这个解决方案,因为它证明你还需要定义一个“处理程序”来定义方法签名,所以我创建了处理程序,并添加到标签库,一切都开始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;
    }

}


文章来源: JSF MethodExpression javax.el.PropertyNotFoundException