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

时间:2013-12-28 10:30:23

标签: java tomcat struts2 netbeans-7

在我的应用程序中执行某些操作时,我得到了

  

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>

12 个答案:

答案 0 :(得分:25)

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

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

正如错误消息所指出的那样,检查Apache Tomcat 7日志中的其他位置(或以其他方式调试应用程序)以查找引发异常的内容。

答案 1 :(得分:6)

我通过将@jsonIgnore添加到另一个对象的List的所有getter来解决此错误

答案 2 :(得分:4)

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

答案 3 :(得分: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);
        }

        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();

并且错误得到解决。 干杯!

答案 4 :(得分:1)

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

答案 5 :(得分:1)

注意:您可以导入2个@JsonIgnore依赖项。确保来自杰克逊图书馆;对我来说很重要:

import com.fasterxml.jackson.annotation.JsonIgnore;

答案 6 :(得分:0)

如果您使用以下注释:@WebFilter,@ WebServlet ...,只需将metadata-complete =“true”添加到web.xml中 e.g

//Array[0][8] = 1;

希望这是你的需要!

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

这就是造成我的情况的原因。

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

答案 9 :(得分:0)

在@ManyToOne上方使用@JsonIgnore

答案 10 :(得分:0)

使用 @JsonIgnore 注释的答案太多了。但我不会推荐它。如果您的父类与单个实体有 many-to-one 关系,那么没问题。但是如果你的父类有两个多对一的关系,那肯定会让你头疼。

我建议采用单向方法并根据您的要求实现单独的 dto 类。

答案 11 :(得分:-2)

我克服了异常,你可以查看你的表结构。我在mysql中执行hibernate生成的sql查询。 除外,抛出异常。

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

我发现表中缺少字段ID。将ID添加到表中,没关系。 希望它有用。