JSF 对话框 在具有素数的复合组件中返回 在 Bean 中选择事件未找到方法

JSF Dialog Return in Composite Component with Primefaces Select Event not finding method in Bean

提问人:Guilherme Pereira 提问时间:11/18/2022 最后编辑:Guilherme Pereira 更新时间:10/3/2023 访问量:162

问:

我正在尝试为我的项目创建一个默认组件,该组件由一个带有用于在单独模式中进行自定义搜索的按钮的组件和一个接收 SelectEvent 的函数组成,该函数用于处理用户选择的值,并在我的 bean 中的其他地方设置该值。问题在于复合组件没有找到 ajax 对话框返回的方法。

我的复合组件名为 inputConverter.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml"   
      xmlns:composite = "http://java.sun.com/jsf/composite"
      xmlns:p="http://primefaces.org/ui">

    <composite:interface>
        <composite:attribute name = "labelValue" required="true"/>
        <composite:attribute name = "inputId" required="true"/>
        <composite:attribute name = "inputValue" required="true"/>
        <composite:attribute name = "inputObject" required="true"/>                        
        <composite:attribute name = "limpaAction" method-signature="void limpaAction()" required="true"/>
        <composite:attribute name = "buscaAction" method-signature="void buscaAction()" required="true"/>
        <composite:attribute name = "retornoAction" method-signature="void retornoAction(org.primefaces.event.SelectEvent)" />
                                                                                                                                        
    </composite:interface>

    <composite:implementation>
        <p:panelGrid columns="1">
            <p:outputLabel for="@next" value="#{cc.attrs.labelValue}"/>

            <p:panelGrid columns="3" styleClass="ui-inputgroup">
                <p:inputText value="#{cc.attrs.inputValue}" readonly="true"/>
                
                <p:commandButton action="#{cc.attrs.limpaAction}" rendered="#{not empty cc.attrs.inputObject}" update="@parent" icon="pi pi-trash" styleClass="ui-button-danger"/>
                <p:commandButton action="#{cc.attrs.buscaAction}" icon="pi pi-search" styleClass="ui-button-info" >
                    <p:ajax event="dialogReturn" listener="#{cc.attrs.retornoAction}" update="@parent"/>
                </p:commandButton>
            </p:panelGrid>
        </p:panelGrid>
    </composite:implementation>
</html>

我在我的主 xhtml 中调用它的方式

<custom:inputConverter 
    labelValue="País"                                
    inputObject="#{pacienteBean.paciente.paisNacionalidade}"
    inputId="#{pacienteBean.paciente.paisNacionalidade.id}"
    inputValue="#{pacienteBean.paciente.paisNacionalidade.nome}"
    buscaAction="#{pacienteBean.buscaNacionalidade}"
    retornoAction="#{pacienteBean.selecionaNacionalidade}"
    limpaAction="#{pacienteBean.limpaNacionalidade}"
/>

我尝试在复合组件中调用的 bean 中的方法

public void selecionaNacionalidade(SelectEvent<Pais> e) {
    objetoCrud.setPaisNacionalidade(e.getObject());
}

问题是复合组件没有通过复合属性找到我的方法,但是当我尝试直接在复合组件中调用#{pacienteBean.selecionaNacionalidade}时,我还尝试以多种方式更改retornoAction的方法签名,但它不起作用。当我在搜索对话框中选择某些内容时,我收到的错误如下:

17-Nov-2022 19:57:12.950 ADVERTÊNCIA [http-nio-8080-exec-87] com.sun.faces.facelets.el.ContextualCompositeMethodExpression.invoke javax.el.MethodNotFoundException: Method not found: [email protected]()
17-Nov-2022 19:57:12.951 ADVERTÊNCIA [http-nio-8080-exec-87] com.sun.faces.facelets.el.ContextualCompositeMethodExpression.invoke jsf.facelets.el.method.expression.invoke.error: javax.el.PropertyNotFoundException: /cadastros/cadastroPacientes.xhtml @69,35 retornoAction="#{pacienteBean.selecionaNacionalidade}": Property [selecionaNacionalidade] not found on type [beans.PacienteBean] #{pacienteBean.selecionaNacionalidade}
17-Nov-2022 19:57:12.951 ADVERTÊNCIA [http-nio-8080-exec-87] com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute /cadastros/cadastroPacientes.xhtml @69,35 retornoAction="#{pacienteBean.selecionaNacionalidade}": Property [selecionaNacionalidade] not found on type [beans.PacienteBean]
    javax.el.PropertyNotFoundException: /cadastros/cadastroPacientes.xhtml @69,35 retornoAction="#{pacienteBean.selecionaNacionalidade}": Property [selecionaNacionalidade] not found on type [beans.PacienteBean]
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:117)
        at com.sun.faces.facelets.el.ContextualCompositeMethodExpression.invoke(ContextualCompositeMethodExpression.java:218)
        at com.sun.faces.facelets.tag.TagAttributeImpl$AttributeLookupMethodExpression.invoke(TagAttributeImpl.java:480)
        at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:71)
        at org.primefaces.event.AbstractAjaxBehaviorEvent.processListener(AbstractAjaxBehaviorEvent.java:48)
        at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
        at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:830)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:835)
        at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:1034)
        at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:79)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:201)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:670)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:367)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:639)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:882)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1693)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:829)
    Caused by: javax.el.PropertyNotFoundException: Property [selecionaNacionalidade] not found on type [beans.PacienteBean]
        at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:267)
        at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:219)
        at javax.el.BeanELResolver.property(BeanELResolver.java:340)
        at javax.el.BeanELResolver.getValue(BeanELResolver.java:101)
        at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:180)
        at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:208)
        at org.apache.el.parser.AstValue.getValue(AstValue.java:168)
        at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
        at org.jboss.weld.module.web.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115)
        ... 35 more
17-Nov-2022 19:57:13.131 GRAVE [http-nio-8080-exec-87] com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError javax.el.PropertyNotFoundException: /cadastros/cadastroPacientes.xhtml @69,35 retornoAction="#{pacienteBean.selecionaNacionalidade}": Property [selecionaNacionalidade] not found on type [beans.PacienteBean]
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:117)
    at com.sun.faces.facelets.el.ContextualCompositeMethodExpression.invoke(ContextualCompositeMethodExpression.java:218)
    at com.sun.faces.facelets.tag.TagAttributeImpl$AttributeLookupMethodExpression.invoke(TagAttributeImpl.java:480)
    at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:71)
    at org.primefaces.event.AbstractAjaxBehaviorEvent.processListener(AbstractAjaxBehaviorEvent.java:48)
    at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:830)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:835)
    at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:1034)
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:79)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:201)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:670)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:367)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:639)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:882)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1693)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: javax.el.PropertyNotFoundException: Property [selecionaNacionalidade] not found on type [beans.PacienteBean]
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:267)
    at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:219)
    at javax.el.BeanELResolver.property(BeanELResolver.java:340)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:101)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:180)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:208)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:168)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at org.jboss.weld.module.web.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115)
    ... 35 more

我正在将 JSF 2.3 与 Primefaces 10.0.0 一起使用。

编辑:找到了解决此问题的解决方法,如果您想查看更多源代码,可以查看:https://github.com/guilhermepereira2917/SettingMusicoterapia

inputConverter.xhtml 上添加了以下远程命令:

<p:remoteCommand name="#{cc.id}" action="#{cc.attrs.retornoAction}" immediate="true"/>

切换对话框返回 inputConverter.xhtml 的 ajax 进行调用:

<p:ajax event="dialogReturn" listener="#{buscaBean.resultadoPesquisaInputConverter}"
        oncomplete="#{cc.id}()"/>

使用以下属性和方法创建会话范围的 Bean BuscaBean.java

public static <T> void resultadoPesquisaInputConverter(SelectEvent<T> event) {
    objetoSelecionado = event.getObject();
}

并通过远程命令的调用方法抓取对话框的选定对象:

@Inject
private BuscaBean buscaBean;

public void selecionaNacionalidade() {
    objetoCrud.setPaisNacionalidade(buscaBean.getResultadoPesquisa(Pais.class));
}

最后我使用输入转换器的方式如下所示:

<custom:inputConverter 
    labelValue="País"                                
    inputObject="#{pacienteBean.paciente.paisNacionalidade}"
    inputId="#{pacienteBean.paciente.paisNacionalidade.id}"
    inputValue="#{pacienteBean.paciente.paisNacionalidade.nome}"
    buscaAction="#{buscaBean.abrirBuscaPaises}"
    retornoAction="#{pacienteBean.selecionaNacionalidade}"
    limpaAction="#{pacienteBean.limpaNacionalidade}"
    />
java jpa jsf primefaces xhtml

评论

0赞 Ömer Faruk Kurt 10/3/2023
你解决了问题吗
0赞 Guilherme Pereira 10/3/2023
我无法按照我想要的方式解决问题,不幸的是,我不得不使用会话 bean 来解决问题。你对源代码感兴趣吗?
0赞 Ömer Faruk Kurt 10/3/2023
我现在面临同样的问题。如果您分享您的解决方案,我将不胜感激
0赞 Guilherme Pereira 10/3/2023
我编辑了这篇文章,试图解释我做了什么不同的事情,但是我试图隐藏更多与这个问题无关的部分(你可以看看我链接的存储库中的那些)。我希望这对你有用,如果你设法解决了它或有任何问题,请给我留言!
0赞 Ömer Faruk Kurt 11/2/2023
通过使用 org.primefaces.event.AbstractAjaxBehaviorEvent 而不是 org.primefaces.event.SelectEvent,对象不再引发 NullPointerException,而是继续发出警告。尽管它发出了警告,但它因此而起作用。我现在以这种方式使用它。github.com/primefaces/primefaces/issues/10777我找不到解决方案。

答: 暂无答案