2017-01-18 5 views
0

JSF 1.2プロジェクトをJSF 2とPrimeFaces 6 Ultimaレイアウトに移行しています。 SimpleJSFNavigationHandlerがjavax.faces.application.ConfigurableNavigationHandlerにキャストすることはできませんSimpleJSFNavigationHandlerはjavax.faces.application.ConfigurableNavigationHandlerにキャストできません

:ウルティマレイアウトを使用する場合 、私は以下の例外を取得します。

どのように修正するのですか?

下記はSimpleJSFNavigationHandlerです。

import java.io.IOException; 

import javax.faces.FacesException; 
import javax.faces.application.NavigationHandler; 
import javax.faces.application.ViewHandler; 
import javax.faces.component.UIViewRoot; 
import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 

import org.springframework.web.jsf.DecoratingNavigationHandler; 

public class SimpleJSFNavigationHandler extends DecoratingNavigationHandler { 


    public static final String DEFAULT_REDIRECT_PREFIX = "redirect:"; 
    public static final String DEFAULT_FORWARD_PREFIX = "/"; 

    private String redirectPrefix = DEFAULT_REDIRECT_PREFIX; 
    private String forwardPrefix = DEFAULT_FORWARD_PREFIX; 

    public SimpleJSFNavigationHandler() { 
    } 


    public SimpleJSFNavigationHandler(NavigationHandler originalNavigationHandler) { 
     super(originalNavigationHandler); 
    } 

    @Override 
    public void handleNavigation(FacesContext facesContext, String fromAction, String outcome, NavigationHandler originalNavigationHandler) { 
     if (outcome != null && outcome.startsWith(redirectPrefix)) { 
     ExternalContext externalContext = facesContext.getExternalContext(); 
     ViewHandler viewHandler = facesContext.getApplication().getViewHandler(); 
      String url = outcome.substring(redirectPrefix.length()); 
      String urlParams=""; 
      if(url.indexOf("?")>0) 
       urlParams = url.substring(url.indexOf("?")); 
      String redirectPath = viewHandler.getActionURL(facesContext, url); 
      try { 
       //System.out.println("MMMMMMMMMMMMMMMM:::::::::::::::::" + urlParams); 
       externalContext.redirect(externalContext.encodeActionURL(redirectPath+urlParams)); 

      } catch (IOException e) { 
       throw new FacesException(e.getMessage(), e); 
      } 
      facesContext.responseComplete(); 
     } else if (outcome != null && outcome.startsWith(forwardPrefix)) { 
     ViewHandler viewHandler = facesContext.getApplication().getViewHandler(); 
     //create new view 
     String newViewId = outcome.substring(forwardPrefix.length()); 
      if (newViewId.length()>0 && newViewId.charAt(0)!='/') { 
       newViewId = "/" + newViewId; 
      } 
     UIViewRoot viewRoot = viewHandler.createView(facesContext, newViewId); 
     viewRoot.setViewId(newViewId); 
     facesContext.setViewRoot(viewRoot); 
     facesContext.renderResponse(); 
     } else { 
     callNextHandlerInChain(facesContext, fromAction, outcome, originalNavigationHandler); 
     } 
    } 

} 

答えて

1

春のDecoratingNavigationHandlerは必要ありません。 JSF独自のConfigurableNavigationHandlerWrapperを使用することができます。今後のJSF 2.3で

public class SimpleJSFNavigationHandler extends ConfigurableNavigationHandlerWrapper { 

    private ConfigurableNavigationHandler wrapped; 

    public SimpleJSFNavigationHandler(ConfigurableNavigationHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public void handleNavigation(FacesContext facesContext, String fromAction, String outcome) { 
     if (...) { 
      // Your original code here. 
     } else if (...) { 
      // Your original code here. 
     } else { 
      // Update only the last else part as below. 
      getWrapped().handleNavigation(facesContext, fromAction, outcome); 
     } 
    } 

    @Override 
    public ConfigurableNavigationHandler getWrapped() { 
     return wrapped; 
    } 

} 

これはさらにFacesWrapper実装では定型的なコードを減らすべきspec issue 1429当たりとしてさらに簡略化することができます。

public class SimpleJSFNavigationHandler extends ConfigurableNavigationHandlerWrapper { 

    public SimpleJSFNavigationHandler(ConfigurableNavigationHandler wrapped) { 
     super(wrapped); 
    } 

    @Override 
    public void handleNavigation(FacesContext facesContext, String fromAction, String outcome) { 
     if (...) { 
      // Your original code here. 
     } else if (...) { 
      // Your original code here. 
     } else { 
      // Update only the last else part as below. 
      getWrapped().handleNavigation(facesContext, fromAction, outcome); 
     } 
    } 

} 
関連する問題