使用JSONQL数据源的Jasper Report含子报表报JRExpressionEvalException错误如何解决
JasperReports JSONQL数据源含子报表的正确配置方案
核心报错原因说明
你遇到的net.sf.jasperreports.engine.fill.JRExpressionEvalException在该场景下90%由数据源传递错误、JSONQL路径配置错误、依赖缺失三类问题导致,可按以下步骤完成配置并排查问题:
1. 依赖校验
JasperReports 6.4及以上版本才原生支持JSONQL数据源,需确保项目引入完整依赖,Maven配置示例如下:
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.20.0</version> <!-- 推荐使用6.15+稳定版 --> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.7.0</version> </dependency>
注意不要遗漏json-path依赖,否则JSONQL解析器会初始化失败,直接触发表达式求值报错。
2. 主报表配置
2.1 代码初始化主数据源
// 传入原始JSON字符串/输入流,第二个参数为主报表对应的JSON根路径 String rawJson = "你的业务JSON数据"; JsonQLDataSource mainDataSource = new JsonQLDataSource(rawJson, "$.data.mainRecords"); // 填充报表时传入主数据源即可
2.2 子报表组件配置
不管是代码写表达式还是用Jaspersoft Studio可视化配置,子报表组件需符合以下规则:
- 子报表路径表达式直接指向编译后的
.jasper文件,示例:$P{SUBREPORT_DIR} + "order_sub.jasper" - 数据源表达式必须构造新的
JsonQLDataSource,使用相对于当前主数据行的相对路径,示例:
new net.sf.jasperreports.engine.data.JsonQLDataSource($P{REPORT_DATA_SOURCE}, "$.subOrderList")
- 参数映射必须添加
REPORT_CONTEXT传递:参数名REPORT_CONTEXT,值为$P{REPORT_CONTEXT},避免子报表无法继承主报表上下文
3. 子报表配置
- 子报表无需单独配置根数据源,默认使用主报表传递的
JsonQLDataSource即可 - 子报表内的字段直接填写相对于子数据源根路径的字段名即可,无需加JSONQL前缀
- 如果需要嵌套多层子报表,重复上述数据源传递逻辑,继续用相对路径构造新的
JsonQLDataSource即可
4. 快速排查清单
如果仍抛出表达式求值错误,按以下顺序排查:
- 单独用JsonPath工具校验你的JSONQL路径是否能从对应层级的JSON节点中取到数据,确认路径无大小写错误、层级错误
- 确认传递给子报表的数据源类型是
JsonQLDataSource,而非字符串、JSONObject等其他类型 - 确认子数据源的路径是相对当前父数据行的相对路径,而非全量JSON的绝对路径
- 确认所有报表的字段名和JSON返回的字段名完全匹配,无拼写错误
内容的提问来源于stack exchange,提问作者FtheBuilder
相关产品推荐
相关产品推荐

