我尝试使用其 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 代码中传递它,但它也破坏了报告。
总体而言,在使用不同的参数组合打印报告后,我要么得到空白页并填充“无数据”部分(用于测试目的),要么得到填充页,但参数为空值。
唯一有效的变体是:
String datasetJson = objectMapper.writeValueAsString(dataSet.getData());
reportData.put("reportData", datasetJson);
<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
,这并不好。为什么不从参数映射中读取流?
所以我的问题是:如何正确地将数据流传递给报告模板?如果数据流不好用,我可以尝试改用传递对象,而不是流。请帮助我找出我做错了什么。
提前致谢!
也尝试过这个答案:
您在“模拟”尝试中缺少查询。 这应该有效:
<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\"}]}"
]
}
]
}
}