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.

configurablenavigationhandler extends contract of navigationhandler allow runtime inspection of navigationcases make rule-base navigation. implementation compliant version of specification in class introduced (or later version) must make navigationhandler extension 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

Popular posts from this blog

php - What is the difference between $_SERVER['PATH_INFO'] and $_SERVER['ORIG_PATH_INFO']? -

fortran - Function return type mismatch -

queue - mq_receive: message too long -