【问题标题】:Sporadic java.lang.IllegalStateException Exception when mixing JSF facelet and JSP renderer混合 JSF facelet 和 JSP 渲染器时出现零星的 java.lang.IllegalStateException 异常
【发布时间】:2010-11-25 15:07:04
【问题描述】:

我正在开发一个包含以下技术的相当古老的网络应用程序。

  • SUN JSF RI 1.1
  • facelets-api 1.1.14
  • JBOSS 4.0.2
  • Quipukit 1.6(一个 AJAX JSF 组件库)

该应用程序最初是使用 JSP 渲染器开发的。对于即将添加的新功能,我们想切换到 facelets,但我们无法重写其余部分,因此我们必须并行运行 facelets 和 JSP 渲染。通常这是可行的,但在某些情况下(不可重现),我们会在应用程序的 JSP 部分遇到以下异常。

    15:34:45,995 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: getWriter() has already been called for this response
    at org.apache.catalina.connector.Response.getOutputStream(Response.java:565)
    at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:171)
    at teamdev.jsf.util.ResourceFilter.doFilter(SourceFile:87)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:153)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
    at java.lang.Thread.run(Thread.java:619)

当异常发生时,它会导致一些奇怪的行为,比如在下一个操作中没有正确提交值(显然 JSF 阶段没有被正确处理)

这是我的 web.xml 和 faces.config 中的相关部分

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


        <context-param>
            <param-name>javax.faces.CONFIG_FILES</param-name>
            <param-value>/WEB-INF/faces-config.xml</param-value>
        </context-param>


        <context-param>
            <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
            <param-value>.jsp</param-value>
        </context-param>

        <!-- Use Documents Saved as *.xhtml -->
        <context-param>
            <param-name>facelets.VIEW_MAPPINGS</param-name>
            <param-value>*.xhtml</param-value>
        </context-param>

        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>/WEB-INF/faces-config.xml</param-value>
            </init-param>
            <init-param>
                <param-name>debug</param-name>
                <param-value>3</param-value>
            </init-param>
            <init-param>
                <param-name>detail</param-name>
                <param-value>3</param-value>
            </init-param>
            <load-on-startup>0</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>

        <session-config>
            <session-timeout>60</session-timeout>
        </session-config>

        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>







<faces-config>
    <application>
        <message-bundle>validatormessages</message-bundle>
        <locale-config>
            <default-locale>de_DE</default-locale>
            <supported-locale>en_GB</supported-locale>
            <supported-locale>en_US</supported-locale>
            <supported-locale>fr_FR</supported-locale>
        </locale-config>
        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
    </application>

...

</faces-config>

感谢任何帮助。

问候

【问题讨论】:

    标签: jsp jsf facelets


    【解决方案1】:

    当 JSP 使用 scriptlet 表达式 (&lt;%= %&gt;) 或当您在 scriptlet 中明确写入 out.print 的输出时,JSP 将调用 getWriter() ( &lt;% %&gt;)。

    验证您的 JSP 页面中是否没有任何此类内容。

    【讨论】:

    • 并非如此,但我们拥有的是 jstl 命令。这也会造成麻烦吗?
    • 经过进一步审查后发现,这是由于 Facelets 与 JSP 渲染器和 JSTL 混合造成的。感谢您提供指引我们走向正确方向的提示。
    猜你喜欢
    • 2014-09-25
    • 2010-09-07
    • 1970-01-01
    • 2017-03-20
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    相关资源
    最近更新 更多