You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jaspersoft Studio子报表不显示求助:单独预览正常主报表无数据

解决JasperReports主报表中子报表不显示的问题

我太懂这种卡了好几个小时的崩溃感——明明单独预览主报表和子报表都能正常拉取JSON数据,合在一起子报表就直接隐身,简直离谱!咱们来一步步把这个坑填上。

核心问题分析

从你贴的代码来看,主要有两个关键错误:

  1. 子报表的QueryString路径重复叠加:主报表已经通过subDataSource("user.documentList")把数据源定位到了user.documentList节点,但子报表里的QueryString又写了user.documentList,相当于在已经定位好的user.documentList下再找user.documentList,肯定找不到数据。
  2. 主报表中documentList字段定义错误:你把数组类型的documentList定义成了java.lang.String,这会导致Jasper处理数据源时出现异常,间接影响子报表的数据源传递。

具体修复步骤

1. 修正子报表的QueryString

打开子报表的代码,把QueryString改成指向当前节点(因为主报表已经把数据源传递到了documentList数组):

<queryString language="json">
    <![CDATA[.]]>
</queryString>

或者直接留空也可以,效果是一样的。

2. 删除主报表中错误的documentList字段

找到主报表里这段代码,直接删掉:

<field name="documentList" class="java.lang.String">
    <property name="net.sf.jasperreports.json.field.expression" value="documentList"/>
    <fieldDescription><![CDATA[documentList]]></fieldDescription>
</field>

documentList是数组,不能定义成String类型,而且子报表通过subDataSource获取数据时,根本不需要主报表里定义这个字段。

3. 优化主报表的子报表数据源表达式

因为主报表的QueryString已经是user,当前的REPORT_DATA_SOURCE已经定位在user节点下,所以数据源表达式里不需要再加user.,直接取documentList即可:

<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("documentList")]]></dataSourceExpression>

4. 可选:用SUBREPORT_DIR参数优化路径

你已经定义了SUBREPORT_DIR参数,子报表路径可以改成动态拼接,避免硬编码路径出错:

<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "testsub4.jasper"]]></subreportExpression>

额外检查点

  • 确认你的JSON数据结构确实是user节点下包含documentList数组,比如:
{
  "user": {
    "firstName": "Owen",
    "lastName": "Doe",
    "email": "owen@example.com",
    "userStatus": "Active",
    "documentList": [
      {"documentType": "Driver License"},
      {"documentType": "Passport"}
    ]
  }
}
  • 确保子报表的.jasper文件已经正确编译,路径和主报表里的配置一致。

按照上面的步骤改完,重新编译预览主报表,子报表应该就能正常显示了!

内容的提问来源于stack exchange,提问作者owjo

火山引擎 最新活动