带有收集参数的 Jasperserver 报表执行服务
Jasperserver report execution service with collection parameter
当我尝试将多个值传递给请求正文中的集合类型参数时,我在生成 jasper 报告时遇到了一些问题。
在我的关系中,我的参数是这样描述的
<parameter name="skillList" class="java.util.Collection" nestedType="java.lang.String">
<parameterDescription><![CDATA[list of skill]]></parameterDescription>
</parameter>
在 jaspersoft studio 中,当我尝试可视化我的报告并添加更多值时,它运行良好并生成了我的报告
但是当我尝试使用 HTTP POST 的服务器执行服务和这样的请求主体时:
<reportExecutionRequest>
<reportUnitUri>MyReportURI</reportUnitUri>
<async>false</async>
<outputFormat>pdf</outputFormat>
<parameters>
<reportParameter name="title">
<value>--- titre test ---</value>
</reportParameter>
<reportParameter name="header">
<value>@@@ header test @@@</value>
</reportParameter>
<reportParameter name="name">
<value>LE TUTOUR</value>
</reportParameter>
<reportParameter name="surname">
<value>Erwan</value>
</reportParameter>
<reportParameter name="skillList">
<value>java</value>
<value>maven</value>
</reportParameter>
</parameters>
</reportExecutionRequest>
如果我在 skillList 参数中只有一个值,我的融洽关系生成良好,但是当我添加另一个值时,我有一个 HTTP 400 错误请求。
在服务的 documentation 中有许多具有多个值的示例,所以我不明白为什么没有生成我的报告。
如果有人有解决方案或遇到同样的问题并解决了它,我不会拒绝任何帮助。
编辑
在一次新的尝试中,我更改了参数,它现在是一个子数据集
<subDataset name="listSkill" uuid="8027f62e-3b29-4faf-b11a-185b4db46d6f">
<field name="skill" class="java.lang.String">
<fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
</subDataset>
以及使用方法
<componentElement>
<reportElement x="0" y="200" width="100" height="30" uuid="26b52f0f-e1e0-451e-9183-2df0f1f1ce65"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="listSkill" uuid="593d4d96-cbaf-46ba-94ef-97344e0cb4f2">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{skills}) ]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="30" width="100">
<textField>
<reportElement x="0" y="0" width="100" height="30" uuid="061f84d9-205a-4f49-a711-1f657b1fa5fd"/>
<textFieldExpression><![CDATA[$F{skill}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
当我生成我的报告时,在 jaspersoft studio 中仍然可以工作,但是当我尝试使用服务器的 REST API 来执行它时就不行了。
解决了这个问题:
现在我只向 rapport 传递 1 个参数,一个 json 字符串,所有参数都作为字段。
我使用匹配该字符串的数据适配器并将所有 $P{xxxx} 替换为 $F{xxxx}。
然后我使用报告的 JSON_INPUT_STREAM
参数将该字符串转换为字节数组输入流。
在这个 json 字符串中,我的列表对象是这样描述的
"LIST_SKILL": [
["skill one", "value 1"],
["skill two", "value 2"],
["skill three", "value 3"]
]
然后在我的列表对象上,在数据集中properties::JRDatasource表达式
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("LIST_SKILL")
之后,我的报告在 jaspersoft studio/server 中正确生成并调用了 rest 服务。
当我尝试将多个值传递给请求正文中的集合类型参数时,我在生成 jasper 报告时遇到了一些问题。 在我的关系中,我的参数是这样描述的
<parameter name="skillList" class="java.util.Collection" nestedType="java.lang.String">
<parameterDescription><![CDATA[list of skill]]></parameterDescription>
</parameter>
在 jaspersoft studio 中,当我尝试可视化我的报告并添加更多值时,它运行良好并生成了我的报告
但是当我尝试使用 HTTP POST 的服务器执行服务和这样的请求主体时:
<reportExecutionRequest>
<reportUnitUri>MyReportURI</reportUnitUri>
<async>false</async>
<outputFormat>pdf</outputFormat>
<parameters>
<reportParameter name="title">
<value>--- titre test ---</value>
</reportParameter>
<reportParameter name="header">
<value>@@@ header test @@@</value>
</reportParameter>
<reportParameter name="name">
<value>LE TUTOUR</value>
</reportParameter>
<reportParameter name="surname">
<value>Erwan</value>
</reportParameter>
<reportParameter name="skillList">
<value>java</value>
<value>maven</value>
</reportParameter>
</parameters>
</reportExecutionRequest>
如果我在 skillList 参数中只有一个值,我的融洽关系生成良好,但是当我添加另一个值时,我有一个 HTTP 400 错误请求。
在服务的 documentation 中有许多具有多个值的示例,所以我不明白为什么没有生成我的报告。
如果有人有解决方案或遇到同样的问题并解决了它,我不会拒绝任何帮助。
编辑 在一次新的尝试中,我更改了参数,它现在是一个子数据集
<subDataset name="listSkill" uuid="8027f62e-3b29-4faf-b11a-185b4db46d6f">
<field name="skill" class="java.lang.String">
<fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
</subDataset>
以及使用方法
<componentElement>
<reportElement x="0" y="200" width="100" height="30" uuid="26b52f0f-e1e0-451e-9183-2df0f1f1ce65"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="listSkill" uuid="593d4d96-cbaf-46ba-94ef-97344e0cb4f2">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{skills}) ]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="30" width="100">
<textField>
<reportElement x="0" y="0" width="100" height="30" uuid="061f84d9-205a-4f49-a711-1f657b1fa5fd"/>
<textFieldExpression><![CDATA[$F{skill}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
当我生成我的报告时,在 jaspersoft studio 中仍然可以工作,但是当我尝试使用服务器的 REST API 来执行它时就不行了。
解决了这个问题:
现在我只向 rapport 传递 1 个参数,一个 json 字符串,所有参数都作为字段。
我使用匹配该字符串的数据适配器并将所有 $P{xxxx} 替换为 $F{xxxx}。
然后我使用报告的 JSON_INPUT_STREAM
参数将该字符串转换为字节数组输入流。
在这个 json 字符串中,我的列表对象是这样描述的
"LIST_SKILL": [
["skill one", "value 1"],
["skill two", "value 2"],
["skill three", "value 3"]
]
然后在我的列表对象上,在数据集中properties::JRDatasource表达式
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("LIST_SKILL")
之后,我的报告在 jaspersoft studio/server 中正确生成并调用了 rest 服务。