有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

rest JasperReport介绍如何在Java中使用远程JSON数据报表运行报表

各位

我在Studio中创建了一个报告,它使用JSON文件数据提供程序指向带有查询参数的GET RESTful端点。在Studio中,当传递参数时,报告工作正常。现在,我正试图从Java控制台应用程序中生成报告,但不知道如何使其运行。如果我直接向它传递JSON,它工作得很好,但是如何让它调用REST端点呢?我是否需要在代码中调用端点,获取JSON并将其传入?我希望JasperReports图书馆会打电话。以下是该项目的相关部分。。希望有人能帮忙

报告定义文件

<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="Inventory01" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="df013db5-f76e-44d3-b0df-bcbc46d93160">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="InventoryByProduct"/>
    <queryString language="json">
        <![CDATA[products]]>
    </queryString>
    <parameter name="storeno" class="java.lang.String" evaluationTime="Early">
        <property name="net.sf.jasperreports.http.data.url.parameter" value="store"/>
    </parameter>
    <parameter name="locale" class="java.lang.String" evaluationTime="Early">
        <property name="net.sf.jasperreports.http.data.url.parameter" value="locale"/>
    </parameter>
    <parameter name="product" class="java.lang.String" evaluationTime="Early">
        <property name="net.sf.jasperreports.http.data.url.parameter" value="product"/>
    </parameter>

Java代码

InputStream employeeReportStream = getClass().getResourceAsStream(reportFile);
jasperReport = JasperCompileManager.compileReport(employeeReportStream);

Map<String, Object> parameters = new HashMap<>();
parameters.put("locale", "en");
parameters.put("product", "680680976804");
parameters.put("storeno", "260");

//************ HOW SHOULD I CREATE THE JsonDataSource OBJECT AND PASS IT TO THE LIBRARY TO EXECUTE?
//************ IF ds WERE A JSON DOCUMENT, IT PRINTS CORRECTLY, BUT I NEED IT TO CALL THE URL OF THE 
//************ RESTFUL ENDPOINT
//            JsonDataSource ds = new JsonDataSource(jsonDataStream);
//            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds); 

谢谢


共 (1) 个答案

  1. # 1 楼答案

    所以我成功了。对于遇到同样问题的人,以下是解决方案

    将Json适配器的定义放在项目中的目录中: project structure screenshot

    在jrxml报告定义中:

    <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="Inventory01" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="df013db5-f76e-44d3-b0df-bcbc46d93160">
        <property name="net.sf.jasperreports.data.adapter" value="data/inventorydataadapter.xml"/>
    

    然后在Java代码中:

                InputStream employeeReportStream = getClass().getResourceAsStream(reportFile);
                jasperReport = JasperCompileManager.compileReport(employeeReportStream);
    
                Map<String, Object> parameters = new HashMap<>();
                parameters.put("locale", "en");
                parameters.put("product", "680680976804");
                parameters.put("storeno", "260");
    
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters);
    
                JRPdfExporter exporter = new JRPdfExporter();
                exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
                exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputPdf));
                SimplePdfReportConfiguration reportConfig = new SimplePdfReportConfiguration();
                reportConfig.setSizePageToContent(true);
                reportConfig.setForceLineBreakPolicy(false);
                SimplePdfExporterConfiguration exportConfig = new SimplePdfExporterConfiguration();
                exportConfig.setMetadataAuthor("Ali M");
                exportConfig.setEncrypted(true);
                exportConfig.setAllowedPermissionsHint("PRINTING");
                exporter.setConfiguration(reportConfig);
                exporter.setConfiguration(exportConfig);
    
                exporter.exportReport();
    

    就这样