Jasper Reports:如何使用 REST API 将 JSON 作为输入流传递

问题描述 投票:0回答:1

我尝试使用其 REST API 将 JSON 字符串作为 InputStream 传递到 Jasper Reports 模板,但无法使其工作:有时模板只是空(无数据),有时有空值,有时在打印时出现错误。

重要的是我们不使用任何 JasperReports 库,仅使用它们的 REST API

这是我所拥有的。

向Jasper服务器请求的参数(Java端):

String jsonString = "{\"name\":\"One\", \"age\":Two, \"car\":Three}";
InputStream iostream = new ByteArrayInputStream(jsonString.getBytes(StandardCharsets.UTF_8));
reportData.put("data", iostream);

向 Jasper 服务器请求负载:

{
    "reportUnitUri": "/reports/***/v1/***",
    "outputFormat": "pdf",
    "async": false,
    "freshData": true,
    "saveDataSnapshot": false,
    "interactive": true,
    "allowInlineScripts": true,
    "ignorePagination": false,
    "pages": null,
    "attachmentsPrefix": null,
    "parameters":
    {
        "reportParameter":
        [
            {
                "name": "data",
                "value":
                [
                    "java.io.ByteArrayInputStream@7f8e1831"
                ]
            }
        ]
    }
}

Jasper 模板:

<parameter name="data" class="java.io.InputStream"/>
<field name="name" class="java.lang.String">
    <property name="net.sf.jasperreports.json.field.expression" value="data.name"/>
...also tried...
    <property name="net.sf.jasperreports.json.field.expression" value="name"/>
</field>

结果:空报告。 尝试使用假模拟值 - 它可以工作,打印,但无法从“数据”参数中获取任何内容:

    <parameter name="mock" class="java.lang.String">
        <defaultValueExpression><![CDATA["{\"mock\":[{\"mockId\": \"1\"}]}"]]></defaultValueExpression>
    </parameter>
    <parameter name="JSON_INPUT_STREAM" class="java.io.InputStream">
        <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{mock}.getBytes("UTF-8"))]]></defaultValueExpression>
    </parameter>
    <parameter name="data" class="java.io.InputStream"/>
    <queryString language="json">
        <![CDATA[]]>
    </queryString>
    <field name="mockId" class="java.lang.String">
        <fieldDescription><![CDATA[mockId]]></fieldDescription>
    </field>

尝试使用 JsonDatasource 类型 -

<parameter name="data" class="net.sf.jasperreports.engine.data.JsonDataSource"/>
- 结果:报告损坏。

尝试使用

JSON_INPUT_STREAM
参数名称并从 Java 代码中传递它,但它也破坏了报告。

总体而言,在使用不同的参数组合打印报告后,我要么得到空白页并填充“无数据”部分(用于测试目的),要么得到填充页,但参数为空值。

唯一有效的变体是:

  1. 将报告参数作为 JSON 字符串传递
String datasetJson = objectMapper.writeValueAsString(dataSet.getData());
reportData.put("reportData", datasetJson);
  1. 在报告模板中这样处理:
    <parameter name="reportData" class="java.lang.String"/>
    <parameter name="JSON_INPUT_STREAM" class="java.io.InputStream">
        <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{reportData}.getBytes("UTF-8"))]]></defaultValueExpression>
    </parameter>

这有效。但正如你所看到的,我将字符串投射到

new java.io.ByteArrayInputStream
,这并不好。为什么不从参数映射中读取流?

所以我的问题是:如何正确地将数据流传递给报告模板?如果数据流不好用,我可以尝试改用传递对象,而不是流。请帮助我找出我做错了什么。

提前致谢!

也尝试过这个答案:

  1. 如何使用 JSON 数据源填充报表而不获取空值?
  2. 使用 JasperReports 从 json 填充报告
  3. Jasper Report - 将 json IO 流传递到子报告
  4. https://community.jaspersoft.com/forums/topic/65690-passing-json-stream-as-datasource-to-subreport/
  5. 如何使用rest将json数据传递到jasper报告
java jasper-reports
1个回答
0
投票

您在“模拟”尝试中缺少查询。 这应该有效:

<parameter name="mock" class="java.lang.String">
    <defaultValueExpression><![CDATA["{\"mock\":[{\"mockId\": \"1\"}]}"]]></defaultValueExpression>
</parameter>
<parameter name="JSON_INPUT_STREAM" class="java.io.InputStream">
    <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{mock}.getBytes("UTF-8"))]]></defaultValueExpression>
</parameter>
<queryString language="json">
    <![CDATA[mock]]>
</queryString>
<field name="mockId" class="java.lang.String">
    <fieldDescription><![CDATA[mockId]]></fieldDescription>
</field>

使用此报表,您可以在报表执行请求中为“mock”参数传递一个字符串值。 如

{
  "reportUnitUri": "...",
  ...
  "parameters": {
    "reportParameter": [
      {
        "name": "mock",
        "value": [
          "{\"mock\":[{\"mockId\": \"2\"}]}"
        ]
      }
    ]
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.