Как обслуживать AbstractResource с помощью IRequestHandler

1

У меня есть форма, и я хочу служить AbstractResource, позвонив

getRequestCycle().scheduleRequestHandlerAfterCurrent(target);

Где цель должна быть реализация IRequestHandler.

Я хочу передать следующий объект AbstractResource.

public class ExcelResponseResource extends AbstractResource {

    @Override
    protected ResourceResponse newResourceResponse(Attributes attributes) {
        ResourceResponse resourceResponse = new ResourceResponse();
        resourceResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        resourceResponse.setTextEncoding("utf-8");
        resourceResponse.setFileName("SomeExport.xlsx");
        resourceResponse.setWriteCallback(new WriteCallback() {
            @Override
            public void writeData(Attributes attributes) {
                try {
                    SomeExport export = new SomeExport(arguments);
                    byte[] byteArray = ((ByteArrayOutputStream)export.getOutputStream()).toByteArray();
                    attributes.getResponse().write(byteArray);
                } catch (Exception e) {
                    log.error("Something went wrong during Excel generation!", e);
                }
            }       
        });
        resourceResponse.disableCaching();

        return resourceResponse;
    }
}

Я хочу знать, как я могу помещать этого зверя в ResourceStreamRequestHandler или что-то подобное.

Заранее спасибо!

Теги:
wicket-1.5

1 ответ

1
Лучший ответ

Изменен AbstractResource для AbstractResourceStream, и теперь он работает как шарм.

ExcelResourceStream stream = new ExcelResourceStream();
ResourceStreamRequestHandler requestHandler = new ResourceStreamRequestHandler(stream);
getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);

И ExcelResourceStream выглядит так:

public class ExcelResourceStream extends AbstractResourceStream {

    private ByteArrayInputStream inputStream;

    @Override
    public String getContentType() {
        return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    }

    @Override
    public Bytes length() {
        return Bytes.bytes(inputStream.available());
    }

    @Override
    public InputStream getInputStream() throws ResourceStreamNotFoundException {
        if (inputStream == null) {
            SomeExport export = new SomeExport();
            try {
                byte[] byteArray = ((ByteArrayOutputStream)export.getOutputStream()).toByteArray();
                inputStream = new ByteArrayInputStream(byteArray);
            } catch (IOException ioe) {
                // STUB
            }
        }

        return inputStream;
    }

    @Override
    public void close() throws IOException {
        if (inputStream != null) {
            inputStream.close();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню