Tomcat异常提交响应后无法调用sendError()吗?

问题描述 投票:23回答:9

在我的应用程序中进行一些操作的同时,我得到了

java.lang.IllegalStateException无法调用sendError()

当我再次重新加载页面时,它可以正常工作一段时间,但是再次显示同样的异常。我该如何克服这个例外?

以下是例外:

HTTP Status 500 - Cannot call sendError() after the response has been committed
type Exception report
message Cannot call sendError() after the response has been committed
description The server encountered an internal error that prevented it from fulfilling this request.
exception 
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:451)
org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:725)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.40 logs.

Struts.xml

<struts>
    <package name="default" extends="hibernate-default">
        <action name="addUser" method="add" class="com.demo.action.UserAction">
            <result name="input">/register.jsp</result>
            <result name="success" type="redirect">list</result>
        </action>
        <action name="list" method="list" class="com.demo.action.UserAction">
            <interceptor-ref name="basicStackHibernate" />
            <result name="success">/list.jsp</result>
        </action>
    </package>
</struts>
java tomcat struts2 netbeans-7
9个回答
26
投票

此错误是其他问题的症状,而不是您要寻找的根本原因。

此错误说明了为什么无法将用户重定向到错误页面。 (原因:服务器已将部分响应缓冲区刷新回客户端-切换/重定向到错误页面为时已晚。)

如错误消息所指出,请检查Apache Tomcat 7日志中的其他位置(或以其他方式调试您的应用程序,以查找引发异常的原因。


6
投票

我通过将@jsonIgnore添加到另一个对象列表的所有获取器中来解决此错误


5
投票

我正在创建@ManyToOne和@OneToMany关系。我在@ManyToOne上方添加了@JsonIgnore,它解决了该错误。


1
投票

这是一个常见错误,可以确定各种根本原因。就我而言,我正在从Web服务中打开pdf文件,为此,我正在使用缓冲区在文件中执行写操作。因此,请在下面进行更改:

        File outfile = File.createTempFile("temp", ".pdf");

        OutputStream os=new FileOutputStream(outfile);
        byte[] buffer = new byte[1024];

        int length;
        /*copying the contents from input stream to
         * output stream using read and write methods
         */
        while ((length = is.read(buffer)) > 0){
            os.write(buffer, 0, length);
        }

to

        File outfile = File.createTempFile("temp", ".pdf");
        IOUtils.copy(is, new FileOutputStream(outfile));

此后,我将执行以下操作:

    javax.ws.rs.core.Response.ResponseBuilder responseBuilder = javax.ws.rs.core.Response
                .ok(outfile, MediaType.APPLICATION_OCTET_STREAM);
                responseBuilder.header("content-type","application/pdf");

             return responseBuilder.build();

错误得到解决。干杯!


1
投票

对于我这种情况下的其他人-发生的是,我有两个@Entity对象,它们之间具有多对多关系,导致生成无限json,从而导致spring security抛出此错误。尝试在您的休眠关系上方添加@JsonIgnore。


0
投票

如果您使用的注释是:@ WebFilter,@ WebServlet ...,只需将meta-complete =“ true”添加到web.xml中例如

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:web="http://java.sun.com/xml/ns/javaee" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
         id="WebApp_ID" metadata-complete="true" version="3.0">

希望这是您的需要!


0
投票

您可以尝试使用此批注,因为它可以解决我的问题。

如果它无法为您提供帮助,那肯定会有所帮助,然后尝试根据您的要求进行修改。

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
   @JsonIdentityReference(alwaysAsId=true)

0
投票

这就是我的原因。

我有2个过滤器,它们都具有通过HttpServletResponse.sendError()方法发送错误的能力。如果过滤器A发现错误并在HttpServletResponse对象上调用sendError,则在同一过滤器或过滤器B中的第二次调用将导致cannot call senderror异常。这是因为sendError不会导致请求本身被中止。调用sendError方法后,过滤器中的代码将继续执行。


-2
投票

我已经克服了异常,您可以检查您的表结构。我在mysql中执行由hibernate生成的sql查询。作为例外,引发了异常。

[Err] 1054 - Unknown column 'this_.ID' in 'field list'

我发现表中缺少字段ID。可以将ID添加到表中。希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.