You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-datasource 3.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:

  1. 移除js-mongodb-datasource和mongodb-jdbc依赖
  2. 注入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");
}
  1. 升级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依赖不变。

验证步骤

  1. 执行mvn dependency:tree检查依赖树,确保MongoDB Driver版本统一
  2. 清理本地Maven仓库并重新构建:mvn clean install -U
  3. 重启项目测试报表生成功能

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:04:52