2010-07-19 8 views
1

Je rencontre des problèmes de redirection à partir d'un bean de vue tronqué dans le cas où nous n'avons pas les informations requises pour la page en question. L'entrée de journal dans @PostContruct est visible dans le journal juste avant un NPE relatif à la vue essayant de se rendre au lieu de suivre ma redirection. Pourquoi ignore-t-il la redirection?Impossible de rediriger à partir d'un constructeur ViewScoped

Voici mon code:

@ManagedBean 
public class WelcomeView { 

    private String sParam; 
    private String aParam; 

    public WelcomeView() { 
     super(); 

     sParam = getURL_Param("surveyName"); 
     aParam = getURL_Param("accountName"); 

     project = fetchProject(sParam, aParam); 

    } 

    @PostConstruct 
    public void redirectWithoutProject() { 
     if (null == project) { 
      try { 
       logger.warn("NO project [" + sParam + "] for account [" + aParam + "]"); 
       FacesContext fc = FacesContext.getCurrentInstance(); 
       fc.getExternalContext().redirect("/errors/noSurvey.jsf"); 
       return; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }   
    } 

    .... 

    public boolean getAuthenticated() { 
     if (project.getPasswordProtected()) { 
      return enteredPassword.equals(project.getLoginPassword()); 
     } else return true; 
    } 

} 

est ici la trace de la pile:

SEVERE: Error Rendering View[/participant/welcome.xhtml] 
javax.el.ELException: /templates/participant/welcome.xhtml @80,70 rendered="#{welcomeView.authenticated}": Error reading 'authenticated' on type com.MYCODE.general.controllers.participant.WelcomeView 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:107) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) 
    at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:416) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1607) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) 
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) 
    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:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at com.MYCODE.general.filters.StatsFilter.doFilter(StatsFilter.java:28) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568) 
    at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:421) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:637) 
Caused by: java.lang.NullPointerException 
    at com.MYCODE.general.controllers.participant.WelcomeView$$M$863c205f.getAuthenticated(WelcomeView.java:127) 
    at com.MYCODE.general.controllers.participant.WelcomeView$$A$863c205f.getAuthenticated(<generated>) 
    at com.MYCODE.general.controllers.participant.WelcomeView.getAuthenticated(WelcomeView.java:125) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:62) 
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53) 
    at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) 
    at org.apache.el.parser.AstValue.getValue(AstValue.java:118) 
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102) 
    ... 33 more 
+0

Remarque, j'ai déjà essayé de mettre la même fonctionnalité directement dans le constructeur au lieu de @PostConstruct. J'ai aussi essayé dispatch et sendRedirect aussi. – Andrew

+0

Veuillez mettre à jour votre question pour inclure le stacktrace du NPE. – BalusC

+0

J'ai ajouté une pile de pile. Il se réfère à la méthode getAuthenticated et le NPE est parce que le projet est nul, donc j'ai ajouté cela aussi. Donc, je suppose que vous voulez voir la pile que la redirection du constructeur est une chose valide à faire, et mon code pour le faire est bien, et le problème est ailleurs alors? – Andrew

Répondre

0

RESOLU! Le problème était que je n'avais pas réalisé que la page serait entièrement compilée indépendamment de ma redirection, donc le projet null était en fait un problème. L'appel à getAuthenticated (qui devrait être réellement authentifié, mais cela ne cause pas de réel problème) a échoué car le projet est nul (comme prévu) et ma logique était que cela ne devrait pas être appelé si la redirection se produit dans le constructeur. C'est des mensonges. La redirection peut être appelée dans le constructeur, mais le bean et la vue sont construits avant la redirection.