2017-01-18 4 views
0

Я переношу проект JSF 1.2 в JSF 2 и PrimeFaces 6 с макетом Ultima. При использовании 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.

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

} 

В предстоящем JSF 2.3 это может даже быть дополнительно упрощена в соответствии с spec issue 1429, который должен дополнительно уменьшить шаблонный код в FacesWrapper реализаций.

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

} 
Смежные вопросы