Почему при использовании JAX-RS и стандартного сервлета загрузка всплывающего окна в браузере не отображается? - PullRequest
0 голосов
/ 07 января 2011

Когда я пытаюсь использовать standard servlet approach, в моем браузере появляется всплывающее окно с вопросом, открыть ли мне файл .xls или сохранить его.

Я попробовал точно такой же код через JAX-RS и всплывающее окно браузера не будет отображаться каким-либо образом. Кто-нибудь сталкивался с этим?

JAX-RS способ, который не будет отображать всплывающее окно:

@Path("excellaTest")
public class ExcellaTestResource {
    @Context
    private UriInfo context;
    @Context
    private HttpServletResponse response;
    @Context
    private HttpServletRequest request;

    public ExcellaTestResource() {
    }


    @Path("horizontalProcess")
    @GET
    //@Produces("application/vnd.ms-excel")
    @Produces("application/vnd.ms-excel")
    public void getProcessHorizontally() {
        try {

            URL templateFileUrl = this.getClass().getResource("myExcelTemplate.xls");
            String templateFilePath = URLDecoder.decode(templateFileUrl.getPath(), "UTF-8");
            String outputFileDir = "MasatoExcelHorizontalOutput";
            ReportProcessor reportProcessor = new ReportProcessor();
            ReportBook outputBook = new ReportBook(templateFilePath, outputFileDir, ExcelExporter.FORMAT_TYPE);

            ReportSheet outputSheet = new ReportSheet("myExcelSheet");
            outputBook.addReportSheet(outputSheet);

            reportProcessor.addReportBookExporter(new OutputStreamExporter(response));
            reportProcessor.process(outputBook);

            System.out.println("done!!");
        }
        catch(Exception e) {
            System.out.println(e);
        }

        return;
    }


}//end class


class OutputStreamExporter extends ReportBookExporter {

    private HttpServletResponse response;

    public OutputStreamExporter(HttpServletResponse response) {
        this.response = response;
    }

    //ReportProcessor output()
    //This method is call when ReportProcessor process() is invoked.
    //The Workbook from POI API can be used to write to stream

    @Override
    public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException {

        //TODO write to stream
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=masatoExample.xls");
            book.write(response.getOutputStream());
            response.getOutputStream().close();
            System.out.println("booya!!");
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }

}//end class

Ответы [ 2 ]

1 голос
/ 07 января 2011

Какую платформу JAX-RS вы используете?

Я предполагаю, что ваш код не работает, потому что вы возвращаете void. Используемая вами структура, вероятно, распознает void как HTTP 204. Нет содержимого. Это заставляет браузер пропускать фактическое тело ответа и игнорировать заголовок conntent-disposition.

Как я уже писал вам в параллельном потоке: попробуйте вернуть объект Response. Вы можете поместить OutputStream или byte [] в качестве объекта, как установлено для заголовка размещения содержимого.

1 голос
/ 07 января 2011

Я никогда не использовал инъекцию на уровне класса для службы jax-rs. Я предлагаю одно из 2 решений.

1) Попробуйте ввести запрос и ответ в качестве аргументов метода.

2) Вывести ваш файл в поток вывода байтового массива и вернуть массив байтов из вашего метода вместо void.

...