Ajax listener method to composite component javax.faces.FacesException: Unable to find attribute in top level component in consuming page

StackOverflow https://stackoverflow.com/questions/20239385

  •  05-08-2022
  •  | 
  •  

Question

I am trying to add an Ajax listener to a composite component, but i am getting the following exception:

09:40:54,161 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
javax.faces.FacesException: : Unable to find attribute with name "myListener" in top level component in consuming page,  or with default value in composite component.  Page author or composite component author error.
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.retargetMethodExpressions(FaceletViewHandlingStrategy.java:718)
    at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:200)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:106)
    at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:178)
    at com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:395)
    at com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:366)
    at com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:111)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
    at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
    at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320)
    at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379)
    at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:358)
    at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
    at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
    at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
    at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
    at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:164)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:914)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at dk.jyskebank.jee.servlet.filter.LogCorrelationIdFilter.doFilter(LogCorrelationIdFilter.java:28)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:534)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn.invoke(ClusteredSingleSignOn.java:731)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.internalProcess(ActiveRequestResponseCacheValve.java:74)
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:47)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:905)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:613)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2036)
    at java.lang.Thread.run(Unknown Source)

My composite component:

<cc:interface>
    <cc:attribute name="text" required="true" />
    <cc:attribute name="renderAsLink" required="true" />
    <cc:attribute name="year" required="true" />
    <cc:attribute name="month" required="true" />
    <cc:attribute name="fravaersoplysningCode" required="true" />
    <cc:attribute name="noteDialog" required="true" />
    <cc:attribute name="myListener"  method-signature="void listener()" required="true" />
</cc:interface>

<cc:implementation> 
    <p:commandLink rendered="#{cc.attrs.renderAsLink}">
        <p:ajax oncomplete="#{cc.attrs.noteDialog}.show()" listener="#{cc.attrs.myListener}"/>

    </p:commandLink>
</cc:implementation>

My controller method:

public void testListener(){
    logger.debug("testListener : {}", String.format("Im working"));
}

My xhtml site:

            <p:column headerText="#{monthEnumBundle[fravaersoplysningerView.fravaerOversigt.months.get(12)]}">
                <component:fravaersoversigtLink 
                    text="#{fravaersoplysning.fravaerMonth.get(12).amount}"
                    renderAsLink="#{fravaersoplysning.fravaerMonth.get(12).content}" 
                    year="#{fravaersoplysning.fravaerMonth.get(12).year}"
                    month="#{fravaersoplysning.fravaerMonth.get(12).month}"
                    fravaersoplysningCode="#{fravaersoplysning.fravaersoplysningCode}"
                    noteDialog="detailDialog"
                    myListener="#{fravaersoplysningerController.testListener()}"/>

            </p:column>

It seems that the binding of myListener (myListener="#{fravaersoplysningerController.testListener() ) is resolved to null. If i try to remove the " method-signature="void listener()" " i dont get the exception anymore, but ofcourse i lose the desired functionality.

If i try to bind the #{fravaersoplysningerController.testListener() method to lets say a button on my xhtml site the method gets called with no problems.

Any ideas whats wrong?

I am running on : JSF 2.1.26, JBOSS 5.1, Primefaces 4.0.4, EL 2.0.2

Was it helpful?

Solution

Ok the solution to this problem was actually very simple. I made a test case and everything was of course working fine, which this case even more frustrating.

The first thing i noticed that setting the required attribute to true, resulted in everything working fine.

After a few hours of testing my mate noticed that we were also using the composite component in another place on the xhtml site (somewhere in a deep dark place :P). But we didn't assign the listener attribute there. So of course since the attribute was required and was NOT set, the exception would appear.

OTHER TIPS

Have you tried to remove the brackets on the listener call?

before:

myListener="#{fravaersoplysningerController.testListener()}"

after:

myListener="#{fravaersoplysningerController.testListener}"

Also, wondering that ´f:ajax´ brings ´oncomplete´ as an attribute, would have expected something like

<f:ajax 
    onevent="function(data){if (data=="complete) { #{cc.attrs.noteDialog}.show();}" 
/>

or like @BalusC says, an primefaces ajax instead...

Edit: Just hacked your example in the IDE, downsized a bit:

xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:io="http://java.sun.com/jsf/composite/inout"
    ...
/>
...
<h:body>

<h:dataTable var="item" value="#{scPaymentLevelValues}">
    <h:column>
        <io:testSomething
            text="myText"
            renderAsLink="myRenderAsLink"
            year="2012"
            month="12"
            fravaersoplysningCode="womething"
            noteDialog="yeah"
            myListener="#{testBean.testListener}" />
    </h:column>
</h:dataTable>
</h:body>
</html>

component:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:cc="http://java.sun.com/jsf/composite">

    <cc:interface>
    <cc:attribute name="text" required="true" />
        <cc:attribute name="renderAsLink" required="true" />
        <cc:attribute name="year" required="true" />
        <cc:attribute name="month" required="true" />
        <cc:attribute name="fravaersoplysningCode" required="true" />
        <cc:attribute name="noteDialog" required="true" />
        <cc:attribute name="myListener" 
                      method-signature="void listener()" required="true" />          
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation> 
     <h:commandButton 
                 value="hhii"
                 rendered="true">
                 <f:ajax 
                     oncomplete="alert('hi');" 
                     listener="#{cc.attrs.myListener}" />
             </h:commandButton> 
    </cc:implementation>
</ui:composition>

Bean:

import java.io.Serializable;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

@Name("testBean")
@Scope(ScopeType.CONVERSATION)
public class TestBean implements Serializable {

    public void testListener(){
        System.out.println("testListener : {}"+ String.format("Im working"));
    }
}

Am getting the desired output testListener : {}Im working. Using Mojarra 2.1.7, Seam 2.3.1.CR1. Can you maybe try downgrading to h:dataTables and h:commandButton, check if it's working there... and if so upgrading to primefaces until it stops working - and then decide how to go on?.

Hope, that helps... if so, please vote. :-)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top