Как справиться с изменением API IResourceStreamWriter в Wicket 1.5?

В Wicket 1.4 у меня был собственный AbstractResourceStreamWriter (используемый в пользовательском типе Link для потоковой передачи файла, который генерируется на лету):

private AbstractResourceStreamWriter resourceStreamWriter() {
    return new AbstractResourceStreamWriter() {
        @Override
        public void write(OutputStream output) {
            try {
                reportService.generateReport(output, report);
            } catch (ReportGenerationException e) {
               // ... 
            }
        }

        @Override
        public String getContentType() {
            return CONTENT_TYPES.get(report.getOutputType());
        }
    };
}

В Wicket 1.5 IResourceStreamWriter был изменен, так что метод получает ответ вместо OutputStream. Несколько сбивает с толку то, что javadocs IResourceStreamWriter все еще говорят о OutputStream:

Специальная реализация IResourceStream, которую ресурс может возвращать, когда он напрямую хочет записать в выходной поток вместо возврата IResourceStream.getInputStream().

...

Реализуйте этот метод для записи данных ресурса непосредственно в данный OutputStream.

Во всяком случае, я не вижу быстрого способа получить OutputStream из ответа.

Учитывая, что у меня есть метод (вызов generateReport(output, report) в приведенном выше коде), который ожидает записи в OutputStream, каков самый простой способ заставить это работать снова?


person Jonik    schedule 29.12.2011    source источник


Ответы (2)


Как насчет

ByteArrayOutputStream baos = new ByteArrayOutputStream();
reportService.generateReport(baos, report);
response.write(baos.toByteArray());

или что-то подобное?

person Nicktar    schedule 29.12.2011
comment
Спасибо, я полагаю, это может сработать. (Невозможно проверить прямо сейчас, так как есть другие нерешенные проблемы миграции 1.5.) Кстати, переменная должна быть определена как ByteArrayOutputStream; Я взял на себя смелость отредактировать ваш ответ. - person Jonik; 29.12.2011
comment
Спасибо... Я удалил его в одной из своих предыдущих правок без участия IDE. Я тоже не могу проверить это прямо сейчас, так как я не могу получить доступ к своим проектам калитки с работы... - person Nicktar; 29.12.2011

Существует org.apache.wicket.request.Response#getOutputStream(). Но опять же я не уверен, что это то же самое, что и в 1.4.x. В 1.5 это будет буферизовать то, что вы пишете в выходном потоке. Где javadoc говорит, что его не следует буферизировать.

person martin-g    schedule 25.03.2012