Fórum IReport + JSF + PrimeFaces - Problema ao exibir o report gerado usando Primefaces media #475395

07/04/2014

0

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

Responder

Posts

07/04/2014

Carlos Proença

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
Responder

Gostei + 0

07/04/2014

Matheus Silva

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á.....
Responder

Gostei + 0

07/04/2014

Carlos Proença

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar