带有收集参数的 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 服务。