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
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
Veuillez mettre à jour votre question pour inclure le stacktrace du NPE. – BalusC
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