Как бороться с изменением API IResourceStreamWriter в Wicket 1.5? - PullRequest
1 голос
/ 29 декабря 2011

В 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 был изменен, так что метод получает Response вместо OutputStream . Несколько странно, что Javadocs IResourceStreamWriter все еще говорит о OutputStream:

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

...

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

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

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

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

А как насчет

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

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

0 голосов
/ 25 марта 2012

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

...