2011-01-05 7 views
8

Gdybym nacisnąć przycisk submit` komunikaty o błędach są wyrzucane w dzienniku serwerajava.lang.IllegalStateException na com.sun.faces.context.FacesContextImpl.assertNotReleased

login.xhtml

<h:form> 
    <p:panel header="Login"> 

     <p:messages id="msgs" showDetail="true"/> 

     <h:panelGrid columns="2" columnClasses="column" cellpadding="5"> 

      <h:outputLabel for="user" value="Username" /> 
      <h:inputText id="user" value="#{login.username}" /> 

      <h:outputLabel for="pw" value="Passwort" /> 
      <h:inputSecret id="pw" redisplay="false" value="#{login.password}" /> 

     </h:panelGrid> 
     <p:commandButton value="Anmelden" action="#{login.login}" type="submit" update="msgs" /> 
    </p:panel> 
</h:form> 

Login.java

@ManagedBean 
@ViewScoped 
public class Login { 

    private FacesContext fCtx; 
    private String username; 
    private String password; 

    public Login() { 
     fCtx = FacesContext.getCurrentInstance(); 
    } 

     public String login(){ 
    //  HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(true); 
    //  String sessionId = session.getId(); 
      fCtx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Info: ", getUsername()+", "+getPassword()+", ")); 

     return "start.xhtml"; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 
    public String getPassword() { 
     return password; 
    } 
} 

Error Stack Trace

05.01.2011 15:24:00 com.sun.faces.application.ActionListenerImpl processAction 
SCHWERWIEGEND: java.lang.IllegalStateException 
javax.faces.el.EvaluationException: java.lang.IllegalStateException 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:311) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
    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:108) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281) 
    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:619) 
Caused by: java.lang.IllegalStateException 
    at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:635) 
    at com.sun.faces.context.FacesContextImpl.addMessage(FacesContextImpl.java:471) 
    at org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.login(Login.java:24) 
    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 org.apache.el.parser.AstValue.invoke(AstValue.java:262) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84) 
    ... 23 more 
05.01.2011 15:24:00 com.sun.faces.lifecycle.InvokeApplicationPhase execute 
WARNUNG: #{login.login}: java.lang.IllegalStateException 
javax.faces.FacesException: #{login.login}: java.lang.IllegalStateException 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:311) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
    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:108) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281) 
    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:619) 
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) 
    ... 22 more 
Caused by: java.lang.IllegalStateException 
    at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:635) 
    at com.sun.faces.context.FacesContextImpl.addMessage(FacesContextImpl.java:471) 
    at org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.login(Login.java:24) 
    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 org.apache.el.parser.AstValue.invoke(AstValue.java:262) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84) 
    ... 23 more 
javax.faces.FacesException: #{login.login}: java.lang.IllegalStateException 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:85) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
    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:108) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281) 
    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:619) 
Caused by: javax.faces.FacesException: #{login.login}: java.lang.IllegalStateException 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:311) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) 
    ... 18 more 
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) 
    ... 22 more 
Caused by: java.lang.IllegalStateException 
    at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:635) 
    at com.sun.faces.context.FacesContextImpl.addMessage(FacesContextImpl.java:471) 
    at org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.login(Login.java:24) 
    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 org.apache.el.parser.AstValue.invoke(AstValue.java:262) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84) 
    ... 23 more 

Na czym polega problem w jaki sposób mogę to naprawić?

Odpowiedz

27

Twój błąd jest tutaj:

@ManagedBean 
@ViewScoped 
public class Login { 

    private FacesContext fCtx; 

    public Login() { 
     fCtx = FacesContext.getCurrentInstance(); 
    } 
} 

Należy nigdy przypisać FacesContext jako zmiennej instancji z widokiem/sesji/aplikacji scoped udało fasola i używać go w różnych wniosków, ponieważ w obecnej instancji FacesContext jest powiązane z bieżącym żądaniem, co sprawia, że ​​z natury jest ono objęte zakresem zamówienia (ale najlepiej też nie jest takie w przypadku ziaren o ustalonym zakresie, ze względu na zły styl, który może być mylący dla początkujących).

Instancja FacesContext jest wydana na koniec żądania. W kolejnych żądaniach instancja uzyskana we wcześniejszym żądaniu jest już nieważna. Gdyby to zadziałało, wszystkie metody pobierające na ExternalContext zwróciłyby ci właściwości (parametry, pliki cookie, nagłówki itp.) Z poprzedniego żądania HTTP i wszystkie metody ustawiacza, które ustawiłyby się na poprzednią odpowiedź HTTP, która została już zatwierdzona przez długi czas. To wszystko nie jest w porządku.

Powinieneś zawsze uzyskać go na podstawie lokalnej dla danego wątku (tj. Bezpośrednio wewnątrz bloku metod). W Twoim konkretnym przypadku, po prostu uzyskać go prosto wewnątrz metody login():

public String login() { 
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info: ", getUsername() + ", " + getPassword() + ", ")); 
    return "start.xhtml"; 
} 
+0

Dzięki jeszcze raz ... Jeden mały krok dla dzisiaj proszę :-) – Sven