Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida - Emitir vários relatórios de uma unica vez

Estou tentando fazer com que a aplicação consiga gerar mais de um arquivo na mesma requisição. Preciso que o usuário clique uma vez no botão "emitir relatório" e a aplicação consiga gerar vários relatórios diferentes de uma vez.

@Named
@RequestScoped
public class GeradorRelatorios implements Serializable {

    private static final long serialVersionUID = 1L;

    private HttpServletResponse response;

    private FacesContext context;
    private InputStream stream;

    public GeradorRelatorios() {

        this.context = FacesContext.getCurrentInstance();
        this.response = (HttpServletResponse) context.getExternalContext().getResponse();
    }

    public void getRelatorio(List<?> lista, Map<String, Object> params, String path, String nomeRelatorio) {
        stream = this.getClass().getResourceAsStream(path);
        context.getExternalContext().getFlash().setKeepMessages(true);

        try {
            JasperPrint print = null;

            JasperReport jasper = (JasperReport) JRLoader.loadObject(stream);

            print = JasperFillManager.fillReport(jasper, params, new JRBeanCollectionDataSource(lista));

            // attachment; inline;
            response.addHeader("Content-disposition", "attachment; filename=" + nomeRelatorio);

            ServletOutputStream servletOutputStream = response.getOutputStream();

            JasperExportManager.exportReportToPdfStream(print, servletOutputStream);

            FacesContext.getCurrentInstance().responseComplete();

            System.out.println("======================================");

        } catch (JRException e) {
            context.addMessage(null, new FacesMessage(e.toString()));
            e.printStackTrace();
        } catch (IOException e) {
            context.addMessage(null, new FacesMessage(e.toString()));
            e.printStackTrace();
        } catch (Exception ex) {
            context.addMessage(null, new FacesMessage(ex.toString()));
            ex.printStackTrace();
            ex.getMessage();
        } finally {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
1 resposta
solução!

Opa, nessa linha, o melhor é vc gerar vários, criar um zip e liberar o download do zip. Um requisição não vai gerar múltiplos downloads :(. Para gerar o zip vc pode usar essa lib aqui => https://github.com/zeroturnaround/zt-zip ou usar a api do java.util. Zip* direto.