gpt4 book ai didi

java - 无法将自定义 NavigationHandler 转换为 javax.faces.application.ConfigurableNavigationHandler

转载 作者:行者123 更新时间:2023-11-29 03:57:17 26 4
gpt4 key购买 nike

关注我的 previous question ,我有一个问题,如果我使用 <p:button> 为什么会抛出这个异常?在 faces-config.xml 中注册 RedirectNavigationHandler 后从 primefaces。 :

SEVERE: Error Rendering View[/TBrowse.xhtml]
java.lang.ClassCastException: my.package.RedirectNavigationHandler cannot be cast to javax.faces.application.ConfigurableNavigationHandler
at org.primefaces.component.button.ButtonRenderer.findNavigationCase(ButtonRenderer.java:114)
at org.primefaces.component.button.ButtonRenderer.buildOnclick(ButtonRenderer.java:90)
at org.primefaces.component.button.ButtonRenderer.encodeMarkup(ButtonRenderer.java:56)
at org.primefaces.component.button.ButtonRenderer.encodeEnd(ButtonRenderer.java:38)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:883)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1659)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
at org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:177)
at org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:120)
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:61)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:883)
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:59)
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:229)
at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:152)
at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:75)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:883)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1659)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
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:313)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
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:161)
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:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
unhandled exception : java.lang.ClassCastException: my.package.RedirectNavigationHandler cannot be cast to javax.faces.application.ConfigurableNavigationHandler
cause exception : java.lang.ClassCastException: my.package.RedirectNavigationHandler cannot be cast to javax.faces.application.ConfigurableNavigationHandler, cause exception is BE : false

使用 <p:commandButton>很好,但 <p:button> 不是这样.

这是我的 faces-config.xml 摘录:

<application>
...
<navigation-handler>id.co.sofcograha.RedirectNavigationHandler</navigation-handler>
...
</application>

和代码:

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 for " + outcome);
outcome += "?faces-redirect=true";
}

parent.handleNavigation(context, from, outcome);
}
}

这是 Maven 依赖项:

<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>

关于这个问题有什么想法吗?

谢谢!

最佳答案

对于 JSF 2.0,您显然应该扩展 ConfigurableNavigationHandler相反。

ConfigurableNavigationHandler extends the contract of NavigationHandler to allow runtime inspection of the NavigationCases that make up the rule-base for navigation. An implementation compliant with the version of the specification in which this class was introduced (or a later version) must make it so that its NavigationHandler is an extension of this class.

(强调我的)这在 NavigationHandler 中没有提到/警告javadoc,所以我在你之前的问题中完全忽略了这一点。

这里是你如何做到的:

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;
}
}

}

关于java - 无法将自定义 NavigationHandler 转换为 javax.faces.application.ConfigurableNavigationHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com