首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF MethodExpression javax.el.PropertyNotFoundException

JSF MethodExpression javax.el.PropertyNotFoundException
EN

Stack Overflow用户
提问于 2012-11-10 22:41:40
回答 1查看 1.4K关注 0票数 3

我正在尝试开发一个自定义组件,它将需要从backingbean调用一个方法,以便从bb获得一些数据(在某个Ajax调用之后在解码阶段调用),其中包含一个参数(它将出现在ajax调用中)。

我遇到的问题是,我将属性定义为MethodExpression (在标签库和组件中),得到Ajax,对参数进行解码,当我试图从组件获得绑定方法时,会得到以下错误:

javax.el.PropertyNotFoundException: /easyFaces.xhtml @19,151 dataSource="#{theBean.loadDataFromSource}":类'ar.com.easytech.faces.test.homeBean‘没有属性'loadDataFromBean’。

这是相关代码..。(如果这不是正确的方法,请告诉我。)

塔格利布:

代码语言:javascript
复制
<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>

组件定义:

代码语言:javascript
复制
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);
    }

最后,生成错误的呈现方法:

代码语言:javascript
复制
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的方法

代码语言:javascript
复制
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

代码语言:javascript
复制
<et:autocomplete id="autoc" minLength="3" delay="500" value="#{easyfacesBean.selectedValue}" dataSource="#{easyfacesBean.autcompleteFromSource}" />

问题是,如果我定义了一个方法getAutocompleteFromSource(),它会识别该方法,并且错误更改为无法将list转换为MethodExpression,所以很明显,它只是将autocompleteFromSource解释为一个简单的属性,而不是一个方法定义,这是否是从BB调用方法的正确方式?(考虑到这不是一个实际的行动或验证)

EN

回答 1

Stack Overflow用户

发布于 2012-11-12 14:25:57

我找到了这个问题的解决方案,因为您还需要定义一个“handler”来定义方法签名,所以我创建了处理程序并添加到taglib中,所有东西都开始运行fine..just以供参考。这是处理程序..。

问候

代码语言:javascript
复制
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;
    }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13326768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档