2011-03-23 31 views
0

私のバッキングBeanの1つでメソッドをプログラムで呼び出す/呼び出す必要があります。私はいくつかの例を見てきましたが、私が見ることから、これはうまくいくはずです。MethodExpression.invoke()でメソッドが見つかりません

私のコード:。

UIData data = (UIData)component; 
fc = FacesContext.getCurrentInstance(); 
elc = fc.getELContext(); 

elFactory = fc.getApplication().getExpressionFactory(); 
mexp = 
    elFactory.createMethodExpression(elc, data.getValueExpression("value").getExpressionString(), Result.class, new Class[]{}); 
Object methodResult = mexp.invoke(elc, null); 

"data.getValueExpresssion(" 値」)でgetExpressionString()は、文字列を返します。私は呼んでいる豆について

#{reports.customer} 

情報をはこれらが適切かどうかわかりません)
クラスのマネージドBean名が "report"です: クラスはセッションスコープ内にある
クラスはSerializable
を私が呼んでいるメソッドのアクセス修飾子が

方法は、私が起動しようとしているメソッドのシグネチャではパラメータはありません
で実装します

public Result getCustomer() { 
    Result result = null; 
    try { 
     ...perform database call 
    } catch (Exception e) { 
     log.error(e); 
    } 
    return result; 
} 

スタック・トレースの抜粋

SEVERE: javax.el.MethodNotFoundException: Method not found: [email protected]() 
javax.faces.el.EvaluationException: javax.el.MethodNotFoundException: Method not found: [email protected]() 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:311) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
... 
Caused by: javax.el.MethodNotFoundException: Method not found: [email protected]() 
    at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:231) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
    at com.npp.business.TableToExcelManager.initExcelWorker(TableToExcelManager.java:247) 
    at com.npp.beans.reports.SharebackReportsBean.exportToExcel(SharebackReportsBean.java:439) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84) 
    ... 26 more 
Mar 23, 2011 11:29:34 AM com.sun.faces.lifecycle.InvokeApplicationPhase execute 
WARNING: #{reports.exportToExcel}: javax.el.MethodNotFoundException: Method not found: [email protected]() 
javax.faces.FacesException: #{reports.exportToExcel}: javax.el.MethodNotFoundException: Method not found: [email protected]() 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:311) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

これに関するお手伝いがありますようお願い申し上げます。

答えて

3

値式をメソッド式として処理しようとしています。これはうまくいきません。値式はゲッターメソッドを指します(したがってgetは省略可能です)。メソッド式がアクションメソッドを指している間に、余分な引数をとる可能性があります。 ValueExpressionが既にあるので、MethodExpressionのように扱う代わりに、直接値を取得してください。

Result result = (Result) data.getValueExpression("value").getValue(elc); 

ビューでEL文字列を変更しないでください。ただそれを保ちなさいvalue="#{reports.customer}"。それ以外の場合は、通常の表示では機能しません。

関連する問題