Файл экспорта: сервлет Faces бросил java.lang.IllegalStateException: не может пересылать после того, как ответ был принят - PullRequest
1 голос
/ 10 ноября 2011

У меня есть метод, который экспортирует файл xls.Метод работает правильно, но после его выполнения я получаю

Faces Servlet бросил java.lang.IllegalStateException: невозможно переслать после того, как ответ был зафиксирован

Вот метод:

public String exportXls() {
    OutputStream out = null;
    try {
        FacesContext cxt = FacesContext.getCurrentInstance();
        ExternalContext context = cxt.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) context.getResponse();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=name.xls");
        out = response.getOutputStream();

        WritableWorkbook workbook = createWorkbook(response);

        // All sheets and cells added. Now write out the workbook
        workbook.write();
        workbook.close(); 
        System.out.println("XLS written!");
    } catch(Exception ex) {
        logger.error("ERROR OCCURRED WITH exportXls" + ex.toString());
    } finally {
        try {
            if (out != null) out.close();
        } catch(IOException e) {
            logger.error(e);
            e.printStackTrace();
        }
    }
    return "page";
}

Я закрыл OutputStream и Workbook.Как вы думаете, может быть проблема?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2011

Вы должны сообщить JSF, что вы уже завершили ответ, позвонив по номеру FacesContext#resposneComplete().Вы также не должны возвращать строку с навигационным регистром (не то, чтобы это повредило, но это совершенно лишнее и сбивало с толку сопровождающего).

public void exportXls() {
    // ...

    FacesContext.getCurrentInstance().responseComplete();
}

Не связано с конкретной проблемойЯ настоятельно рекомендую удалить блок catch (Exception ex) и заменить его на throws IOException в методе.Все, что может выдать код, это IOException.Вы не должны проглотить это исключение, но позволить контейнеру обработать его.Это также позволяет вести более централизованную регистрацию исключений с помощью Filter.

0 голосов
/ 10 ноября 2011

Вы не можете пересылать (или перенаправлять) после того, как на клиент будет выведен контент.

То, что вы пытаетесь сделать, было бы равносильно получению двух ответов назад для одного запроса - вы можете получить файлназад или новая страница, но не обе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...