Как вызвать выражение метода с параметрами?

#jsf #jsf-2

#jsf #jsf-2

Вопрос:

Могу ли я передать выражение в качестве параметра выражения метода следующим образом?

 <p:dataTable id="gridRPBDetails" var="rpbDetail"
  value="#{tInputBean.detailList}"
  selection="#{tInputBean.selectedDetails}">

....

   <p:commandButton 
      process="@this" 
      action="#{tInputBean.querySubAnggaranListImpl(rpbDetail.map['budget'])}" ... />

....

</p:datatable>
  

Я пробовал это, но закончилось исключением :

 DEBUG PhaseTracker - BEFORE PHASE INVOKE_APPLICATION 5
Apr 28, 2011 3:22:17 PM com.sun.faces.application.ActionListenerImpl processAction
SEVERE: java.lang.NullPointerException
javax.faces.el.MethodNotFoundException: java.lang.NullPointerException
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:104)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIData.broadcast(UIData.java:915)
        at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException
        at java.lang.Class.isAssignableFrom(Native Method)
        at org.apache.el.util.ReflectionUtil.isAssignableFrom(ReflectionUtil.java:299)
        at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:172)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:251)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
        at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
        ... 25 more
Apr 28, 2011 3:22:17 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
WARNING: #{tInputBean.querySubAnggaranListImpl(rpbDetail.map['budget'])}: java.lang.NullPointerException
javax.faces.FacesException: #{tInputBean.querySubAnggaranListImpl(rpbDetail.map['budget'])}: java.lang.NullPointerException
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:110)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIData.broadcast(UIData.java:915)
        at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: javax.faces.el.MethodNotFoundException: java.lang.NullPointerException
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:104)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
        ... 24 more
Caused by: java.lang.NullPointerException
        at java.lang.Class.isAssignableFrom(Native Method)
        at org.apache.el.util.ReflectionUtil.isAssignableFrom(ReflectionUtil.java:299)
        at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:172)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:251)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
        at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
        ... 25 more
DEBUG PhaseTracker - AFTER PHASE INVOKE_APPLICATION 5
javax.faces.FacesException: #{tInputBean.querySubAnggaranListImpl(rpbDetail.map['budget'])}: java.lang.NullPointerException
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: javax.faces.FacesException: #{tInputBean.querySubAnggaranListImpl(rpbDetail.map['budget'])}: java.lang.NullPointerException
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:110)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIData.broadcast(UIData.java:915)
        at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
        ... 18 more
Caused by: javax.faces.el.MethodNotFoundException: java.lang.NullPointerException
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:104)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
        ... 24 more
Caused by: java.lang.NullPointerException
        at java.lang.Class.isAssignableFrom(Native Method)
        at org.apache.el.util.ReflectionUtil.isAssignableFrom(ReflectionUtil.java:299)
        at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:172)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:251)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
        at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
        ... 25 more
  

Вот мой метод action (пожалуйста, обратите внимание, что rpbDetail.map[‘budget’] является типом DataTransferObject, поэтому он должен соответствовать прямому назначению) :

 public void querySubAnggaranListImpl(DataTransferObject budget) {
    DebugUtil.start("querySubAnggaranListImpl");
    String budgetId = budget.getString("id");

    // cari subbudgetlist berdasarkan budgetId
    this.comboChainSubAnggaranList = ch.execute("common", "GetSubBudgetList", 
        new DataTransferObject()
            .putString("budgetId", budgetId))
        .getList("result");
    DebugUtil.end("querySubAnggaranListImpl");
}
  

Я попробовал это из deperation: action="#{tInputBean.querySubAnggaranListImpl(#{rpbDetail.map['budget']})}" и в итоге в моем браузере появилось это сообщение об ошибке :

/TInput.xhtml @161,40 action=»#{tInputBean.Запрос subanggaranlistimpl(#{rpbDetail.map[‘budget’]})}» Идентификатор [#] не является допустимым идентификатором Java, как того требует раздел 1.19 спецификации EL (Идентификатор ::= идентификатор языка Java). Эту проверку можно отключить, установив системному свойству org.apache.el.parser.SKIP_IDENTIFIER_CHECK значение true.


Как я могу передать параметр выражению метода, как в моем случае выше?

Спасибо!

Комментарии:

1. Интересная проблема, возможно, я захочу попытаться воспроизвести это позже. А пока попробуйте rpbDetail.map.budget вместо этого.

2. @BalusC: Привет, спасибо за идею. Я, наконец, обнаружил, что это была моя ошибка. Это должен быть rpbDetail.map.subBudget.map.budget. rpbDetail.map.budget возвращает значение null, отсюда исключение NullPointerException.

3. Ах, все же тогда это не должно было вызывать такого рода NPE. Какой servletcontainer / EL impl вы используете? Tomcat 7.x в стандартной комплектации, я полагаю?

4. @BalusC: О, я понимаю. Tomcat 7.0.8. А el-решателем является .. org.springframework.web.jsf.el.SpringBeanFacesELResolver с весенней версией 3.0.5.RELEASE.

Ответ №1:

Я, наконец, обнаружил, что это была моя ошибка. Это должно быть

 rpbDetail.map.subBudget.map.budget. 
  

rpbDetail.map.budget возвращает null, следовательно NullPointerException .