Fala galera! Bão?
Procurei no forum mas não encontrei algo parecido.
Tô com dois problemas ao gerar/chamar meu arquivo via JSF 2:
1 - Por um botão, preciso chamar meu método e ao final fazer o download do arquivo gerado por ele.
2 - O nome do arquivo no download está sempre “application_pdf” mesmo setando o nome correto.
Com o código abaixo eu consigo o que eu preciso para o meu 1 problema, porém, não é atualizado o “update”, ou seja, a mensagem nunca é atualizada, nem no caso de sucesso, nem ao dar erro e é jogado o exception na tela do usuário:
<p:commandButton value="#{rotulo.confirmar}" actionListener="#{familiasHabilitadasObservacaoMBean.gerarRelatorio}" ajax="false" update=":mensagens">
<p:fileDownload name="fileName" value="#{familiasHabilitadasObservacaoMBean.arquivo}"/>
</p:commandButton>
Meu método:
public void gerarRelatorio() {
try {
List<Map<String, Object>> lstFamilias = familiasHabilitadasObservacaoService
.consultarFamiliasHabilitadasObservacao(empreendimentoSelecionado, parcelaSelecionado,
ordenarPorSelecionado);
if (lstFamilias.isEmpty()){
addMessage(FacesMessage.SEVERITY_ERROR, "Nenhum registro encontrado.");
return;
}
List<Integer> lstAux = new ArrayList<Integer>();
lstAux.add(0);
String titulo = RelatorioConstants.TIT_FAMILIAS_HABILITADAS_OBSERVACAO;
EmpreendimentoEntity dadosEmpreendimento = (EmpreendimentoEntity) ReflectionUtils
.findFromListById(lstEmpreendimento, empreendimentoSelecionado.getIdentEmpreend(),
"identEmpreend");
String subTitulo = dadosEmpreendimento.getNomeEmpreend();
FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
String pathRel = servletContext.getRealPath("/WEB-INF/classes/");
String pathImg = servletContext.getRealPath("/imagens/logo_cdhu.gif");
Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put("dados", lstFamilias);
parametros.put("titulo", titulo);
parametros.put("subTitulo", subTitulo);
parametros.put("SUBREPORT_DIR", pathRel);
parametros.put("pathImg", pathImg);
arquivo = super.gerarRelatorio(
"familiasHabilitadasObservacao/familiasHabilitadasObservacao.jasper", lstAux,
parametros, FormatoExportacaoEnum.PDF, "familiasHabilitadasObservacao.pdf");
addMessage(FacesMessage.SEVERITY_INFO, "Relatório gerado com sucesso.");
} catch (BCException e) {
addMessage(FacesMessage.SEVERITY_ERROR, "Erro ao gerar relatório.");
} catch (Exception e) {
addMessage(FacesMessage.SEVERITY_ERROR, "Erro ao gerar relatório.");
}
Método pai:
public StreamedContent gerarRelatorio(String templatePath, List objects, Map<String, Object> parametros,
FormatoExportacaoEnum formatoExportacao, String nomeSaida) throws BCException, JRException {
InputStream relatorio = null;
try {
ByteArrayOutputStream byteArrayOutStream = new ByteArrayOutputStream();
JRDataSource lista = new JRBeanCollectionDataSource(objects);
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(RelatorioMBean.class.getClassLoader()
.getResourceAsStream(templatePath));
jasperReport.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);
JasperPrint print = JasperFillManager.fillReport(jasperReport, parametros, lista);
JRExporter exporter = null;
switch (formatoExportacao) {
case PDF:
exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
break;
case XML:
exporter = new net.sf.jasperreports.engine.export.JRXmlExporter();
break;
case XLS:
exporter = new net.sf.jasperreports.engine.export.JRXlsExporter();
break;
case CSV:
exporter = new net.sf.jasperreports.engine.export.JRCsvExporter();
break;
case HTML:
exporter = new net.sf.jasperreports.engine.export.JRHtmlExporter();
break;
default:
exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
break;
}
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, byteArrayOutStream);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.exportReport();
relatorio = new ByteArrayInputStream(byteArrayOutStream.toByteArray());
} catch (JRException ex) {
LOG.error("Error : " + ex);
throw ex;
}
return new DefaultStreamedContent(relatorio, formatoExportacao.getContentType(), nomeSaida);
}
Se alguém tiver uma ideia de como solucionar esses dois problemas, agradeceria bastante!
Valeww!