Jaspersoft Studio子报表不显示求助:单独预览正常主报表无数据
解决JasperReports主报表中子报表不显示的问题
我太懂这种卡了好几个小时的崩溃感——明明单独预览主报表和子报表都能正常拉取JSON数据,合在一起子报表就直接隐身,简直离谱!咱们来一步步把这个坑填上。
核心问题分析
从你贴的代码来看,主要有两个关键错误:
- 子报表的QueryString路径重复叠加:主报表已经通过
subDataSource("user.documentList")把数据源定位到了user.documentList节点,但子报表里的QueryString又写了user.documentList,相当于在已经定位好的user.documentList下再找user.documentList,肯定找不到数据。 - 主报表中
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




