java - Custom NavigationHandler cannot be cast to javax.faces.application.ConfigurableNavigationHandler -
following previous question, have question why exception being thrown if use <p:button> primefaces after registering redirectnavigationhandler in faces-config.xml. :
severe: error rendering view[/tbrowse.xhtml] java.lang.classcastexception: my.package.redirectnavigationhandler cannot cast javax.faces.application.configurablenavigationhandler @ org.primefaces.component.button.buttonrenderer.findnavigationcase(buttonrenderer.java:114) @ org.primefaces.component.button.buttonrenderer.buildonclick(buttonrenderer.java:90) @ org.primefaces.component.button.buttonrenderer.encodemarkup(buttonrenderer.java:56) @ org.primefaces.component.button.buttonrenderer.encodeend(buttonrenderer.java:38) @ javax.faces.component.uicomponentbase.encodeend(uicomponentbase.java:883) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1659) @ javax.faces.render.renderer.encodechildren(renderer.java:168) @ javax.faces.component.uicomponentbase.encodechildren(uicomponentbase.java:853) @ com.sun.faces.renderkit.html_basic.htmlbasicrenderer.encoderecursive(htmlbasicrenderer.java:304) @ com.sun.faces.renderkit.html_basic.gridrenderer.renderrow(gridrenderer.java:185) @ com.sun.faces.renderkit.html_basic.gridrenderer.encodechildren(gridrenderer.java:129) @ javax.faces.component.uicomponentbase.encodechildren(uicomponentbase.java:853) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1652) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1655) @ org.primefaces.component.tabview.tabviewrenderer.encodecontents(tabviewrenderer.java:177) @ org.primefaces.component.tabview.tabviewrenderer.encodemarkup(tabviewrenderer.java:120) @ org.primefaces.component.tabview.tabviewrenderer.encodeend(tabviewrenderer.java:61) @ javax.faces.component.uicomponentbase.encodeend(uicomponentbase.java:883) @ org.primefaces.renderkit.corerenderer.renderchild(corerenderer.java:59) @ org.primefaces.renderkit.corerenderer.renderchildren(corerenderer.java:43) @ org.primefaces.component.panel.panelrenderer.encodecontent(panelrenderer.java:229) @ org.primefaces.component.panel.panelrenderer.encodemarkup(panelrenderer.java:152) @ org.primefaces.component.panel.panelrenderer.encodeend(panelrenderer.java:75) @ javax.faces.component.uicomponentbase.encodeend(uicomponentbase.java:883) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1659) @ javax.faces.render.renderer.encodechildren(renderer.java:168) @ javax.faces.component.uicomponentbase.encodechildren(uicomponentbase.java:853) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1652) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1655) @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1655) @ com.sun.faces.application.view.faceletviewhandlingstrategy.renderview(faceletviewhandlingstrategy.java:399) @ com.sun.faces.application.view.multiviewhandler.renderview(multiviewhandler.java:131) @ com.sun.faces.lifecycle.renderresponsephase.execute(renderresponsephase.java:121) @ com.sun.faces.lifecycle.phase.dophase(phase.java:101) @ com.sun.faces.lifecycle.lifecycleimpl.render(lifecycleimpl.java:139) @ javax.faces.webapp.facesservlet.service(facesservlet.java:313) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:306) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:240) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:161) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:164) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:100) @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:541) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:383) @ org.apache.coyote.http11.http11processor.process(http11processor.java:243) @ org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:188) @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:288) @ java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908) @ java.lang.thread.run(thread.java:662) unhandled exception : java.lang.classcastexception: my.package.redirectnavigationhandler cannot cast javax.faces.application.configurablenavigationhandler cause exception : java.lang.classcastexception: my.package.redirectnavigationhandler cannot cast javax.faces.application.configurablenavigationhandler, cause exception : false using <p:commandbutton> fine, not <p:button>.
here's faces-config.xml excerpt :
<application> ... <navigation-handler>id.co.sofcograha.redirectnavigationhandler</navigation-handler> ... </application> and code :
import javax.faces.application.navigationhandler; import javax.faces.context.facescontext; public class redirectnavigationhandler extends navigationhandler { private navigationhandler parent; public redirectnavigationhandler(navigationhandler parent) { this.parent = parent; } @override public void handlenavigation(facescontext context, string from, string outcome) { if (outcome != null && !outcome.trim().equals("") && !outcome.endswith("?faces-redirect=true")) { system.out.println("adding faces redirect " + outcome); outcome += "?faces-redirect=true"; } parent.handlenavigation(context, from, outcome); } } here's maven dependencies :
<dependency> <groupid>com.sun.faces</groupid> <artifactid>jsf-api</artifactid> <version>2.0.4-b09</version> <scope>compile</scope> </dependency> <dependency> <groupid>com.sun.faces</groupid> <artifactid>jsf-impl</artifactid> <version>2.0.4-b09</version> <scope>compile</scope> </dependency> <dependency> <groupid>org.primefaces</groupid> <artifactid>primefaces</artifactid> <version>2.2.1</version> </dependency> any ideas on matter ?
thank !
for jsf 2.0 you're apparently supposed extend configurablenavigationhandler instead.
configurablenavigationhandlerextends contract ofnavigationhandlerallow runtime inspection ofnavigationcasesmake rule-base navigation. implementation compliant version of specification in class introduced (or later version) must makenavigationhandlerextension of class.
(emphasis mine) way not mentioned/warned in navigationhandler javadoc, overlooked bit in previous question.
here's how it:
package com.example; import java.util.map; import java.util.set; import javax.faces.application.configurablenavigationhandler; import javax.faces.application.navigationcase; import javax.faces.application.navigationhandler; import javax.faces.context.facescontext; public class redirectnavigationhandler extends configurablenavigationhandler { private navigationhandler parent; public redirectnavigationhandler(navigationhandler parent) { this.parent = parent; } @override public void handlenavigation(facescontext context, string from, string outcome) { if (!outcome.endswith("?faces-redirect=true")) { outcome += "?faces-redirect=true"; } parent.handlenavigation(context, from, outcome); } @override public navigationcase getnavigationcase(facescontext context, string fromaction, string outcome) { if (parent instanceof configurablenavigationhandler) { return ((configurablenavigationhandler) parent).getnavigationcase(context, fromaction, outcome); } else { return null; } } @override public map<string, set<navigationcase>> getnavigationcases() { if (parent instanceof configurablenavigationhandler) { return ((configurablenavigationhandler) parent).getnavigationcases(); } else { return null; } } }
Comments
Post a Comment