IReport + JSF + PrimeFaces - Problema ao exibir o report gerado usando Primefaces media

Java

07/04/2014

Olá a todos, Seguinte, tenho um sistema web Em Java com JSF e PrimeFaces onde em determinada tela eu faço a geração e exibiço de um report na tela. Para isso, eu estou usando o iReport e o Primefaces. O real problema é o seguinte: Eu tenho uma grid onde para cada linha é possivel gerar um report, acontece que quando eu clico no botão para, por exemplo, gerar o report para a linha 10 ele, apesar de no método gerar o report pra linha certa (inclusive, estranhamente, ele salva uma cópia desse report na minha máquina) ele exibe no componente media do primefaces sempre um mesmo report, que é o correspondente ao report que seria gerado pela primeira linha da grid.

Já perdi bastante tempo batendo a cabeça com isso e resolvi pedir a ajuda de vocês.

Página XHTML:
<p:dataTable id="amostraDataTable" var="amostra"
                    value="#{searchAmostraBean.amostraList}" paginator="true" rows="10"
                    paginatorTemplate="     "
                    rowsPerPageTemplate="5,10,15"
                    emptyMessage="A pesquisa não retornou resultados"
                    paginatorPosition="bottom">

                    <p:column style="width: 184px;height: 50px;">
                        <f:facet name="header">
                            <p:commandLink id="create" action="pretty:createAmostra"
                                title="Novo">
                                <h:graphicImage value="/images/btn_novo.png" />
                            </p:commandLink>
                        </f:facet>
                        <p:panelGrid columns="3" style="width: 40px;height: 30px;">
                            <pretty:link mappingId="changeAmostra" title="Editar">
                                <f:param value="#{amostra.id}" />
                                <h:graphicImage value="/images/btn_editar.png" />
                            </pretty:link>
                            <pretty:link mappingId="removeAmostra" title="Apagar">
                                <f:param value="#{amostra.id}" />
                                <h:graphicImage value="/images/btn_apagar.png" />
                            </pretty:link>
                            <pretty:link mappingId="visualizeAmostra" title="Ver">
                                <f:param value="#{amostra.id}" />
                                <h:graphicImage value="/images/btn_ver.png" />
                            </pretty:link>
                            <p:commandButton id="gerarPdf" value="gerar pdf" rendered="true"
                                oncomplete="PF('reportVar').show();" actionListener="#{searchAmostraBean.putAmostra(amostra)}"
                                update=":amostraForm:commonReport :amostraForm:pdfView">
                            </p:commandButton>
                        </p:panelGrid>
                    </p:column>
<!--  resto das linhas ignorado  -->

<p:dialog id="commonReport" resizable="false" draggable="false"
                position="center" width="500" height="300" modal="true"
                header="OCPlus - Etiqueta de rastreio" dynamic="true" 
                widgetVar="reportVar" >
                <p:outputPanel id="reportPanel">
                    <p:media id="pdfView" value="#{searchAmostraBean.etiqueta}" width="100%"
                        height="300px" player="pdf" >
                    </p:media>
                </p:outputPanel>
            </p:dialog>

Managed Bean
public void putAmostra(Amostra amostra){
        this.amostra = amostra;
    }

    public StreamedContent getEtiqueta(){
        File etiqueta = null;
        InputStream is;
        try {
            ArrayList<Amostra> listAmostra = new ArrayList<Amostra>();
            listAmostra.add(amostra);
            JRBeanCollectionDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(listAmostra);
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, new HashMap<String,Object>(),jrBeanCollectionDataSource);
            JRExporter exporter = new JRPdfExporter();
            etiqueta =new File("OCPlusTicket_"+amostra.getNumero().toString());

            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE, etiqueta);
            exporter.exportReport();

            is = new FileInputStream(etiqueta);
            etiqueta.deleteOnExit();
            DefaultStreamedContent sc = new DefaultStreamedContent(is,"application/pdf","OCPlusTicket_"+amostra.getNumero().toString());
            return sc;
        } catch (JRException | FileNotFoundException e ) {
            e.printStackTrace();
            return null;
        }

    }


Desde já agradeço.
Matheus Silva

Matheus Silva

Curtidas 0

Respostas

Carlos Proença

Carlos Proença

07/04/2014

Fala Matheus blz?

a ideia que eu te dou é separar a geração do carregamento....

tenta criar o arquivo pdf com o ireport... depois carrega ele por outro meio e mostra na tela...

acho que assim é mais facil de voce identificar qual arquivo voce esta mandando... e verifica se ele existe antes de mandar pra tela...

depois quando tiver tempo posso dar uma analisada melhor no seu codigo para ver onde esta o erro...

mas tenta isso ai e fala se conseguiu blz??

att
GOSTEI 0
Matheus Silva

Matheus Silva

07/04/2014

Oi Carlos, obrigado pela ajuda.
Seguinte, antes eu fazia isso. Tinha um método só pra gerar o StreamedContent e na hora de mostrar no componente eu já passava essa variável. Acontece que desse jeito nem funciona da NullException e mostra apenas uma tela cinza.

Já to sem esperanças já.....
GOSTEI 0
Carlos Proença

Carlos Proença

07/04/2014

rssrsr

calma pequeno gafanhoto.... tipo o problema entao é no carregamento do arquivo sacou??

da uma olhada nesse link GUJ

eu estou no trabalho.. entao estou meio sem disponibilidade pra dar uma olhada no code... mas.... tenta verificar esta parte que voce vai conseguir...

qualquer coisa me manda email que consigo te ajudar mais tarde!!!

att
GOSTEI 0
POSTAR