Spring Boot集成Jasper Reports连接MongoDB报错求助
问题
基于Maven的Spring Boot项目,使用Jasper Reports生成报表,连接MariaDB时运行正常,切换为MongoDB作为数据源后编译通过但运行报错。项目其他模块通过Spring Data MongoDB(spring-boot-starter-data-mongodb/MongoRepository)可正常连接目标MongoDB。
核心报错
com.smartapi.utils.Utils$MsgException: jasper.error ...[ommitted]... Caused by: java.lang.NoSuchMethodError: 'java.lang.Integer com.mongodb.ConnectionString.getThreadsAllowedToBlockForConnectionMultiplier()' ...[omitted]...
MongoDB报表生成核心代码
public static void processJasperReportFromDbToPdf(ReportRq rq, OutputStream os) { rq.params.put(JRParameter.REPORT_CLASS_LOADER, subreportClassloader); long start = System.currentTimeMillis(); try ( Connection mongoDBConnection = new MongoDbConnection("mongodb://localhost:27017/my_database?authSource=admin", null, null); ) { JasperPrint jasperPrint = JasperFillManager.fillReport(rq.report, rq.params, mongoDBConnection); JasperExportManager.exportReportToPdfStream(jasperPrint, os); } catch (Throwable t) { Utils.throwMessage(t, "jasper.error", rq.reportName); } long time = System.currentTimeMillis() - start; logger.info("Created: " + rq.reportName + ". Time=" + time + "msec"); }
MariaDB正常运行代码(对比)
public static void processJasperReportFromDbToPdf(ReportRq rq, OutputStream os) { rq.params.put(JRParameter.REPORT_CLASS_LOADER, subreportClassloader); long start = System.currentTimeMillis(); try ( Connection mariaDBConnection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/my_database?user=my_database_user&password=my_password"); ) { JasperPrint jasperPrint = JasperFillManager.fillReport(rq.report, rq.params, mariaDBConnection); JasperExportManager.exportReportToPdfStream(jasperPrint, os); } catch (Throwable t) { Utils.throwMessage(t, "jasper.error", rq.reportName); } long time = System.currentTimeMillis() - start; logger.info("Created: " + rq.reportName + ". Time=" + time + "msec"); }
项目POM核心依赖配置
<repositories> <repository> <id>jfrog.io</id> <name>jfrog.io</name> <url>https://jaspersoft.jfrog.io/artifactory/jrs-ce-addons-releases/</url> </repository> </repositories> <dependencies> <!-- Spring Boot 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>3.1.3</version> </dependency> <!-- Jasper Reports 依赖 --> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.17.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-functions</artifactId> <version>6.17.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-fonts</artifactId> <version>6.17.0</version> </dependency> <!-- MongoDB 数据源依赖 --> <dependency> <groupId>com.jaspersoft.connectors.mongodb</groupId> <artifactId>js-mongodb-datasource</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-jdbc</artifactId> <version>2.0.3</version> </dependency> </dependencies>
已尝试的无效方案
- 移除/保留
mongodb-jdbc依赖,问题未解决 - 更换多个旧版本
js-mongodb-datasource(2.0.8、2.0.5、2.0.2),出现其他方法未找到或类访问错误 - 改用
DriverManager获取连接,注册MongoDriver后提示无合适驱动 - 降级Jasper Reports至
js-mongodb-datasource依赖的6.8.1版本,出现类未找到的压缩包错误
问题原因与解决方案
核心原因
报错NoSuchMethodError源于MongoDB Java驱动版本冲突:
- Spring Boot Starter Data MongoDB 3.1.3依赖MongoDB Driver 4.3.x,该版本中
ConnectionString.getThreadsAllowedToBlockForConnectionMultiplier()方法已被移除(3.x版本存在,4.x中替换为getMaxWaitQueueSize()) js-mongodb-datasource3.10.2依赖MongoDB Driver 3.x版本,运行时加载了Spring Boot引入的4.x驱动,导致方法找不到
解决方案
方案1:统一MongoDB Driver版本为3.x
修改Spring Boot Data MongoDB依赖,排除自带的4.x驱动,手动引入与js-mongodb-datasource兼容的3.x版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>3.1.3</version> <exclusions> <exclusion> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> </exclusion> <exclusion> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-core</artifactId> </exclusion> <exclusion> <groupId>org.mongodb</groupId> <artifactId>bson</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入兼容的3.x版本MongoDB Driver --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>3.12.11</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-core</artifactId> <version>3.12.11</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>bson</artifactId> <version>3.12.11</version> </dependency>
同时移除mongodb-jdbc依赖,js-mongodb-datasource已包含所需连接逻辑。
方案2:复用Spring Data的MongoClient,替换数据源实现
放弃直接实例化MongoDbConnection,改用Jasper Reports官方的MongoDbDataSource,复用Spring管理的MongoClient:
- 移除
js-mongodb-datasource和mongodb-jdbc依赖 - 注入Spring的
MongoClient到报表生成类,修改代码:
@Autowired private MongoClient mongoClient; public void processJasperReportFromDbToPdf(ReportRq rq, OutputStream os) { rq.params.put(JRParameter.REPORT_CLASS_LOADER, subreportClassloader); long start = System.currentTimeMillis(); try { MongoDbDataSource dataSource = new MongoDbDataSource(mongoClient, "my_database"); JasperPrint jasperPrint = JasperFillManager.fillReport(rq.report, rq.params, dataSource); JasperExportManager.exportReportToPdfStream(jasperPrint, os); } catch (Throwable t) { Utils.throwMessage(t, "jasper.error", rq.reportName); } long time = System.currentTimeMillis() - start; logger.info("Created: " + rq.reportName + ". Time=" + time + "msec"); }
- 升级Jasper Reports至6.20.0+,该版本已适配MongoDB Driver 4.x
方案3:升级js-mongodb-datasource至兼容4.x驱动的版本
使用Jasper官方最新的js-mongodb-datasource版本(需确认其已适配MongoDB Driver 4.x),保持Spring Data MongoDB依赖不变。
验证步骤
- 执行
mvn dependency:tree检查依赖树,确保MongoDB Driver版本统一 - 清理本地Maven仓库并重新构建:
mvn clean install -U - 重启项目测试报表生成功能
内容的提问来源于stack exchange,提问作者KvotheTheArcane
相关产品推荐
相关产品推荐

