Исключение Tomcat Не удается вызвать sendError() после того, как ответ был исправлен?

Выполняя некоторые операции в моем приложении, я получил

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>

Ответы

Ответ 1

Эта ошибка является симптомом какой-либо другой проблемы, а не основной причиной, которую вы ищете.

Эта ошибка объясняет, почему пользователь не может быть перенаправлен на страницу с ошибкой. (Причина: сервер уже сбросил часть буфера ответа обратно клиенту - слишком поздно для переключения/перенаправления на страницу с ошибкой.)

Как указано в сообщении об ошибке, проверьте в других местах журналы Apache Tomcat 7 (или отлаживайте приложение другим способом), чтобы найти то, что бросает исключение.

Ответ 2

Я решил эту ошибку, добавив @jsonIgnore ко всем геттерам для списка другого объекта

Ответ 3

Это обычная ошибка, и может быть обнаружена различная причина. В моем случае я открывал 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

если вы используете аннотации, такие как: @WebFilter, @WebServlet..., просто добавьте metadata-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">

Надеюсь, это ваши потребности!

Ответ 5

Вы можете попробовать эту аннотацию, это поможет, поскольку она исправила мою проблему.

Это определенно поможет, если он не сможет вам помочь, а затем попробуйте изменить это согласно вашему требованию.

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

Ответ 6

Для других в моей ситуации - то, что происходило, было то, что у меня было два объекта @Entity со многими отношениями, вызывающими бесконечный json, которые вызывали бы весеннюю безопасность, чтобы выбросить эту ошибку. Попробуйте добавить @JsonIgnore над вашими спящими отношениями.

Ответ 7

Для меня работает @JsonManagedReference в "Родительском" объекте и @JsonBackReference в "Дочернем" объекте.

Ответ 8

Я создавал отношения @ManyToOne и @OneToMany. Я добавил @JsonIgnore выше @ManyToOne, и это решило ошибку.

Ответ 9

Я преодолел исключение, вы можете проверить структуру таблицы. Я выполняю SQL-запрос, созданный спящим в mysql. Как исключено, было исключено исключение.

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

Я обнаружил, что идентификатор поля отсутствует в таблице. Добавьте идентификатор в таблицу, это нормально. Надеюсь, что это будет полезно.