将托管bean引用为复合属性并调用其方法会导致MethodNotFoundException

时间:2015-02-17 22:14:39

标签: jsf-2 el managed-bean composite-component

我正在尝试创建一个复合组件来接收像我的ManagedBean这样的参数。

这是我的复合组件:

<composite:interface>
    <composite:attribute name="label" required="true"
        shortDescription="Valor que será mostrado no campo. Ex: Id" />
    <composite:attribute name="methodName" required="true"
        shortDescription="Nome do método que realiza o get ao campo. Ex: getId" />
    <composite:attribute name="managedBeanName"
        type="br.com.jwebbuild.mb.BasicCrudMBImpl" required="true"
        shortDescription="Nome do managedBean do componente" />
</composite:interface>

<composite:implementation>

    <h:commandLink value="#{cc.attrs.label}"
        actionListener="#{cc.attrs.managedBeanName.orderby(cc.attrs.methodName)}"
        title="Clique para ordernar">
        <f:ajax execute="@this" render="@form" />
    </h:commandLink>
    <i class="fa fa-bars fa-fw"></i>

</composite:implementation>

当我尝试执行时出现错误:MethodNotFoundException。但是,如果我改变这一行

    actionListener="#{cc.attrs.managedBeanName.orderby(cc.attrs.methodName)}"

为此:

    actionListener="#{bancaMB.orderby(cc.attrs.methodName)}"

一切正常,但为什么我的复合材料不能与cc.attrs一起使用?我有一些复合组件,它们接收相同的ManagedBean并且工作正常。

看,在这段代码中我正在使用这个复合组件:

<jw:orderColumLink managedBeanName="#{bancaMB}"
                                                    methodName="getId" label="Id" />

修改1

此代码正常工作,并使用managedBean参数方法:

<composite:interface>
    <composite:attribute name="idDataTable" default="dataTableListagem"
        shortDescription="ID do DataTable. Usado para referencia em outras partes do código" />
    <composite:attribute name="managedBeanName"
        type="br.com.jwebbuild.mb.BasicCrudMBImpl" required="true"
        shortDescription="Nome do managedBean do componente" />

    <composite:attribute name="showSelectAll" type="boolean" default="true"
        shortDescription="Mostra a coluna para selecionar todos os registros. Padrão = true" />

    <composite:attribute name="showEditRemove" type="boolean"
        default="true"
        shortDescription="Mostra a coluna para editar e remover um registro. Padrão = true" />

    <composite:attribute name="targetPage" type="String"
        shortDescription="Caminho para acesso a página de inserção ou alteração do registro." />

</composite:interface>

<composite:implementation>

    <div class="table-responsive">
        <h:dataTable var="bean" value="#{cc.attrs.managedBeanName.beans}"
            id="#{cc.attrs.idDataTable}" styleClass="table table-hover"
            binding="#{cc.attrs.managedBeanName.dataTable}">
            <h:column rendered="#{cc.attrs.showSelectAll}"
                headerClass="smallColumn">
                <f:facet name="header">
                    <h:selectBooleanCheckbox
                        valueChangeListener="#{cc.attrs.managedBeanName.selectAll}">
                        <f:ajax execute="@form" render="@form" />
                    </h:selectBooleanCheckbox>
                </f:facet>

                <h:selectBooleanCheckbox value="#{bean.selected}">
                    <f:ajax execute="@this" render="@this" />
                </h:selectBooleanCheckbox>
            </h:column>

            <composite:insertChildren />

            <h:column rendered="#{cc.attrs.showEditRemove}"
                headerClass="smallColumn">
                <h:link styleClass="btn btn-default"
                    outcome="#{cc.attrs.managedBeanName.redirectAlterarBean(cc.attrs.targetPage,bean.id)}">
                    <i class="fa fa-pencil-square-o fa-lg"></i> Editar
                    </h:link>
            </h:column>

        </h:dataTable>
    </div>
    <!-- /.table-responsive -->
</composite:implementation>

编辑2 我正在使用“com.sun.faces”JSF 2.2.6(jsf-api,jsf-impl) 完整的StackTrace轰鸣声:

Fev 18, 2015 1:44:41 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
Advertência: Method not found: br.com.cardoso.mb.BancaMBImpl@24cc8c62.orderby()
javax.el.MethodNotFoundException: Method not found: br.com.cardoso.mb.BancaMBImpl@24cc8c62.orderby()
    at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:225)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:253)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:813)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIData.broadcast(UIData.java:1108)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    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:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    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:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    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:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

Fev 18, 2015 1:44:41 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
Grave: javax.el.MethodNotFoundException: Method not found: br.com.cardoso.mb.BancaMBImpl@24cc8c62.orderby()
    at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:225)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:253)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:813)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIData.broadcast(UIData.java:1108)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    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:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    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:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    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:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

0 个答案:

没有答案