estoy tratando de desarrollar una aplicación web para la presentación de informes, y han construido un sitio con EJB3 + primefaces ya. Ahora estoy de cabeza dolor de cómo integrar Jasperreport en primefaces… he encontrado ninguna guía o discusión acerca de este tema, me pregunto no es posible? o en realidad no es una manera correcta de hacer? En realidad, soy bastante nuevo para desarrollar JavaEE6, no plan para el uso de frameworks como spring y costura todavía.


modelo

@Stateless
@LocalBean
public class BookEJB {
    //@Override
    public void printReport() throws ClassNotFoundException, IOException, JRException, SQLException {
        Connection connection;
        Map parameterMap = new HashMap();

        FacesContext ctx = FacesContext.getCurrentInstance();

        HttpServletResponse response = (HttpServletResponse) ctx
                .getExternalContext().getResponse();

        InputStream reportStream = ctx.getExternalContext()
                .getResourceAsStream("reports/report1.jasper");

        ServletOutputStream servletOutputStream = response.getOutputStream();
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://localhost/bookdb?user=root&password=******");

        ctx.responseComplete();
        response.setContentType("application/pdf");

        JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameterMap, connection);

        connection.close();
        servletOutputStream.flush();
        servletOutputStream.close();

    }
}

Controlador de

@ManagedBean(name = "bookCtrl")
@RequestScoped
public class BookController {

    @EJB
    private BookEJB bookEJB;

    public void doPrintReport() throws ClassNotFoundException, IOException, JRException, SQLException {
        bookEJB.printReport();
    }
}

vista (JSF)

<body>
<f:view>
    <h:outputText value="Click on the link below to generate the report." />
    <h:form>
        <h:commandButton action="#{bookCtrl.doPrintReport}" value="Generate Report" />
    </h:form>
</f:view>
</body>

Jasper

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report1" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString language="SQL">
<![CDATA[SELECT
*
FROM
`book` book]]>
</queryString>
<field name="Id" class="java.lang.Integer"/>
<field name="title" class="java.lang.String"/>
<field name="price" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="45" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="21" splitType="Stretch">
<staticText>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<text><![CDATA[Id]]></text>
</staticText>
<staticText>
<reportElement x="100" y="0" width="100" height="20"/>
<textElement/>
<text><![CDATA[title]]></text>
</staticText>
<staticText>
<reportElement x="200" y="0" width="100" height="20"/>
<textElement/>
<text><![CDATA[price]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="24" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.Integer"><![CDATA[$F{Id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{title}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{price}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>

El error se produjo cuando hago clic en el botón de JSF, por debajo de registro es a partir de glassfish

WARNING: A system exception occurred during an invocation on EJB BookEJB method public void blah.BookEJB.printReport() throws java.lang.ClassNotFoundException,java.io.IOException,net.sf.jasperreports.engine.JRException,java.sql.SQLException
javax.ejb.EJBException.....
SEVERE: javax.ejb.EJBException
javax.faces.el.EvaluationException: javax.ejb.EJBException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
WARNING: #{bookCtrl.doPrintReport}: javax.ejb.EJBException
javax.faces.FacesException: #{bookCtrl.doPrintReport}: javax.ejb.EJBException...
Caused by: javax.faces.el.EvaluationException: javax.ejb.EJBException...
SEVERE: javax.faces.FacesException: #{bookCtrl.doPrintReport}: javax.ejb.EJBException...
Caused by: javax.faces.FacesException: #{bookCtrl.doPrintReport}: javax.ejb.EJBException...
Caused by: javax.faces.el.EvaluationException: javax.ejb.EJBException...
Caused by: javax.ejb.EJBException...
Caused by: java.lang.NullPointerException...
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response.....
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response.....
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response.....
cómo resolver el «java.lang.IllegalStateException: PWC3991: getOutputStream() ya ha sido llamado para esta respuesta» problema? supongo que es glassfish problema en lugar de Jasper y Primefaces ahora…
Su EJB es tirar un NullPointerException y que es el núcleo de su problema de aquí. Cuál es su stacktrace?

OriginalEl autor Mythox | 2011-02-25

4 Comentarios

  1. 4

    ¿Has probado con el p:fileDownload componente dentro de su commandLink?

    Ver:
    http://www.primefaces.org/showcase/ui/fileDownload.jsf

    De esa manera, en vez de liarte con responseComplete o tener que hacer un aparte servlet, que acaba de tener otro controlador/managed bean método que devuelve una instancia de StreamedContent (primefaces clase).

    OriginalEl autor wrschneider

  2. 1

    Está modificando la respuesta después de «responseComplete()». Llamar «responseComplete()» debe ser la última cosa que hacer.

    OriginalEl autor Aaron

  3. 1

    Mejor manera de lidiar con jasper-métodos para desactivar el ajax en el commandButton/commandLink. Eso es cómo es posible permanecer con la Jasper-conversión.

    <p:commandButton title="EK Preview" icon="fa fa-file-pdf-o" actionListener="#{ctrlFiDoc.doReport_PC}" ajax="false"/>

    No hay necesidad de permanecer estrictamente a la p:fileDownload-elemento si no es necesario.

    OriginalEl autor DanielK

  4. 0

    Probablemente esta línea es la causa del problema:

    InputStream reportStream = ctx.getExternalContext()
    .getResourceAsStream(«informes/informe1.jasper»);

    Ver esta pregunta

    OriginalEl autor SDReyes

Dejar respuesta

Please enter your comment!
Please enter your name here