Search code examples
javajspjasper-reports

How to pass data source to sub report and load sup report in jasper report using JSP


Please help. I create Jasper Report only Main report it's worked fine. But when I add sub-report to it. It cause error. It cannot Evaluate Parameter I put. I also try use (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper) but it cause error cannot load file, too.

Here is my JSP:

try{
            
    List<Map<String, ?>> dataSource = (List<Map<String, ?>>) request.getAttribute("listProducts");
    JRDataSource jrDataSource = new JRBeanCollectionDataSource(dataSource);

    List<Map<String, ?>> dataSource_sub = (List<Map<String, ?>>) request.getAttribute("listProducts");
    JRDataSource jrDataSource_sub = new JRBeanCollectionDataSource(dataSource);

    /*
    String jrxmlFile_Jasper = session.getServletContext().getRealPath("reports/productreport.jasper");  
    JasperReport jasperReport_onLoad = (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper);
    */
    
    String jrxmlFile = session.getServletContext().getRealPath("reports/productreport.jrxml");
    InputStream input = new FileInputStream(new File(jrxmlFile));
    JasperReport jasperReport = JasperCompileManager.compileReport(input);
    
    
    String jrxmlFile_Sub = session.getServletContext().getRealPath("reports/sub_productreport.jrxml");
    InputStream input_sub = new FileInputStream(new File(jrxmlFile_Sub));
    JasperReport jasperReport_Sub = JasperCompileManager.compileReport(input_sub);
    
    
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("SUBREPORT_DIR", jasperReport_Sub);

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);

    JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
    response.getOutputStream().flush();
    response.getOutputStream().close(); 
    
}catch(Exception e){
    e.printStackTrace();
}

Here is sub-report in Jasper Main report:

         <subreport>
            <reportElement x="150" y="22" width="200" height="30" uuid="d1150b63-2c7b-4dcc-858c-b73dbe178455"/>
            <subreportParameter name="SUBREPORT_DIR">
                <subreportParameterExpression><![CDATA[""]]></subreportParameterExpression>
            </subreportParameter>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportExpression>
        </subreport>

Here is Error which I got:

20:57:09,547 ERROR [stderr] (default task-1) net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: $P{SUBREPORT_DIR}

20:57:09,548 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.fill.JREvaluator.handleEvaluationException(JREvaluator.java:287)

20:57:09,548 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:319)

20:57:09,548 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:671)

20:57:09,549 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:639)

And I also got Error when I try to use : (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper)

    String jrxmlFile_Jasper = session.getServletContext().getRealPath("reports/productreport.jasper");  
    JasperReport jasperReport_onLoad = (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper);


    

Error of (JasperReport) JRLoader: I saw the last location on error show has ".", I don't knwo why it auto add ".". I'm a new of Jasper Report I try search for solution two day already, but I cannot fix it. please help.

21:12:47,644 ERROR [stderr] (default task-1) net.sf.jasperreports.engine.JRException: Class not found when loading object from file: D:\Working\WebServer\wildfly-21.0.0.Final\standalone\deployments\helloworld.war\reports\productreport.jasper.

21:12:47,645 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:152)

21:12:47,645 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:116)

21:12:47,645 ERROR [stderr] (default task-1) at deployment.helloworld.war//net.sf.jasperreports.engine.util.JRLoader.loadObjectFromFile(JRLoader.java:107)


Solution

  • After research for several days, I can fix it and it's worked.

    1. We need to update version of both JSP Jasper Dependency and Jasper Studio (Report Design tool) to be the same.

    2. Make sure, we create Fields and Parameters correctly in Jasper Report and its same as we assign from JSP.

    3. If we use JRBeanCollectionDataSource, we have to use only one dataSource pass throw to sub-report. It mean we must use ArrayList in ArrayList.

    4. In sub-report, we have to use dataSourceExpression: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource ($Field_dataSource_to_Sub-Report_that_class_is_ArrayList)