3

bb からデータを取得するために backingbean からメソッドを呼び出す必要があるカスタム コンポーネントを開発しようとしています (これは、特定の Ajax 呼び出しの後にデコード フェーズで呼び出されます)。 ajax 呼び出し)。

私が抱えている問題は、属性を MethodExpression として (taglibrary とコンポーネントで) 定義し、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() を定義すると、メソッドが認識され、エラーが変更されてリストを MethodExpression に変換できないため、単純に autocompleteFromSource をメソッド定義ではなく単純なプロパティとして解釈していることです。 BB からメソッドを呼び出す正しい方法は? (実際のアクションでも検証でもないことを考えると)

4

1 に答える 1

3

メソッドシグネチャを定義するには「ハンドラー」も定義する必要があることが判明したため、これに対する解決策を見つけたので、ハンドラーを作成して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;
    }

}
于 2012-11-12T14:25:57.510 に答える