【问题标题】:JSF 2, Ajax, FacesException: java.lang.IllegalStateExceptionJSF 2、Ajax、FacesException:java.lang.IllegalStateException
【发布时间】:2013-05-23 18:18:53
【问题描述】:

我使用 ajax 事件编写了我的第一个 JSF 页面,但无法正常工作;当提交表单异常发生IllegalStateException 这个想法是在选中复选框时更改 inputText 激活书写的颜色。 看看下面的内容。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Ins Student</title> 
</h:head>
    <h:form id="windowPrinc" prependId="false">
        <h:panelGrid id="griglia" columns="4">    
            <h:outputLabel value="Matricola....................:"></h:outputLabel>
                <h:inputText id="id_matricola" style="background-color:#{controllerInsertStudent.color_idStudente};border-style:solid; 
                        border-color:Brown;border-width:medium;"
                        readonly="#{!controllerInsertStudent.forzaMatricola}" title="matricola dello studente"
                        value="#{controllerInsertStudent.idStudente}">  
                </h:inputText>       

            <h:outputLabel value=" Forza Matricola...........:"/>  
            <h:selectBooleanCheckbox id="id_checkBox"  value="#{controllerInsertStudent.forzaMatricola}">
                <f:ajax>  execute="id_checkBox" listener="#{controllerInsertStudent.changeForzaMatricola}" render="id_matricola" </f:ajax>  
            </h:selectBooleanCheckbox>
        </h:panelGrid>  
   <h:outputLabel value="Nome:........................:" />
        <h:inputText id="id_nome" style="border-style:solid;border-color:Brown;border-width:medium;" value="#{controllerInsertStudent.nome}">       
        </h:inputText>
    <h:commandButton value="Inserisci" action="#{controllerInsertStudent.CreateStudente}">
    <f:ajax execute="@form"  />
   </h:commandButton>
    </h:form>
</html>

这个托管 bean

@ManagedBean
@ViewScope
public class ControllerInsertStudent {
            FacesContext ctx = FacesContext.getCurrentInstance();   
        private Long idStudente; 
            // etc.
        public Boolean getForzaMatricola()
        {
            return forzaMatricola;
        }


        public void setForzaMatricola(Boolean forzaMatricola)
        {
            this.forzaMatricola = forzaMatricola;

        }

        public void changeForzaMatricola(AjaxBehaviorEvent ev) throws AbortProcessingException
        {
            // dummy
        }
      public String CreateStudente()
  {

    String value = ctx.getExternalContext().getRequestParameterMap().get("id_matricola");
    if(!value.equals(""))
        this.idStudente = new Long(value);
            // etc.
    }

}

堆栈错误(控制台 Eclipse)

17:54:52,916 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-  localhost-127.0.0.1-8080-1) #{controllerInsertStudent.CreateStudente}: java.lang.IllegalStateException: javax.faces.FacesException: #{controllerInsertStudent.CreateStudente}: java.lang.IllegalStateException
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_13]
 Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
... 20 more
 Caused by: java.lang.IllegalStateException
at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:655) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.context.FacesContextImpl.getExternalContext(FacesContextImpl.java:140) [jsf-impl-2.1.7-jbossorg-2.jar:]
at org.controllers.beans.ControllerInsertStudent.CreateStudente(ControllerInsertStudent.java:237) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_13]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_13]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_13]
at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_13]
at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
... 21 more

【问题讨论】:

  • 为什么将属性放在&lt;f:ajax&gt; 标签之外?这是在制定问题时粗心的错字,还是这真的是真正的代码?这将回答问题,但这是一个太明显的错误,因为您在页面中的所有其他标签上正确使用了属性。甚至语法高亮显示了一个很大的提示。
  • 真实代码;代码中的错误,因为 Eclipse 代码中的警告(对不起)。但现在我有另一个问题。当我选择 id_checkBox 编辑 id_matricola 但提交表单时,托管 bean 中的 idsudente 值为 null。我在 viewscope 中更改了托管 bean 的范围,现在有这个错误 javax.faces.el.E​​valutationException (java.lang.IllegalStateException: javax.faces.FacesException: #{controllerInsertStudent.CreateStudente}) CreateSudente 是提交时的方法调用。向上堆栈错误。

标签: ajax jsf-2


【解决方案1】:

我将忽略代码中的红鲱鱼,即在标签本身之外错误地拥有&lt;f:ajax&gt; 标签属性,这将导致监听器方法永远不会被调用。但是,这与堆栈跟踪相矛盾,因此表明您已在实际代码中解决了问题,但没有费心相应地更新问题,因此仍然保留了红鲱鱼,这使得问题可能令人困惑和无法回答。

回到堆栈跟踪中可见的具体问题:

Caused by: java.lang.IllegalStateException
    at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:655) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.context.FacesContextImpl.getExternalContext(FacesContextImpl.java:140) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at org.controllers.beans.ControllerInsertStudent.CreateStudente(ControllerInsertStudent.java:237) [classes:]

这表明您错误地将先前请求的FacesContext 获取为支持 bean 的实例变量,该支持 bean 被放置在比请求范围更广的范围内。

换句话说,你有一个

@ManagedBean
@ViewScoped // Or session or application scoped.
public class ControllerInsertStudent {

    private FacesContext context = FacesContext.getCurrentInstance();

    public void CreateStudente() { // Eeeek, method name starts with uppercase? Fix it!
        // ...

        ExternalContext externalContext = context.getExternalContext(); // Fail!

        // ...
    }

}

这绝对不正确。这样的 bean 是在与调用其操作的 HTTP 请求不同的 HTTP 请求中创建的。您不应该使用不同 HTTP 请求的 FacesContext 实例。 FacesContext 在内部存储为 ThreadLocal&lt;FacesContext&gt; 在服务于 HTTP 请求的线程中,该请求在请求结束时被释放/丢弃,因此在任何其他线程中不再有效(阅读:任何其他 HTTP 请求)。

您应该获取它是线程本地的(阅读:在方法块内),而不是将其分配为比单个 HTTP 请求寿命更长的对象的实例变量,例如视图范围的托管 bean。

@ManagedBean
@ViewScoped // Or session or application scoped.
public class ControllerInsertStudent {

    public void CreateStudente() { // Eeeek, method name starts with uppercase? Fix it!
        // ...

        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext externalContext = context.getExternalContext(); // OK!

        // ...
    }

}

但是,我不确定这与迄今为止发布的显示请求范围 bean 的代码有何关系。看起来你在用代码准备问题时又一次粗心了。 IE。到目前为止显示的代码根本不是真正的代码,或者与最初的问题完全无关,因此您混淆了各种问题。

【讨论】:

  • 我根据您的建议更改了代码,现在一切正常,谢谢 BalusC。
  • 不客气。将来,请发布一个真正的 SSCCE,而不是拼凑在一起的代码。真正的 SSCCE 是可复制、粘贴、运行的,无需对代码进行不明显的更改。这样,您的问题就不太可能被忽略并更快地得到回答。另见stackoverflow.com/tags/jsf/info
猜你喜欢
  • 2011-12-05
  • 2011-05-30
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2012-07-21
  • 2011-06-29
  • 2011-05-30
  • 2023-03-12
相关资源
最近更新 更多