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

Spring Reactive(R2DBC)连接MSSQL失败排查求助

解决Spring Reactive (R2DBC) 连接SQL Server无响应及404问题

看起来你遇到的问题是多重因素叠加的:依赖版本不兼容、错误被静默吞掉、可能的端口配置错误,甚至控制器映射的有效性也需要验证。我来一步步帮你排查修复:

一、优先修复依赖版本不匹配问题

你的Spring Boot版本是2.2.6.RELEASE,但搭配的Spring Data R2DBC是快照版本,且R2DBC SQL Server驱动版本过旧,同时快照仓库还没开启,这会导致依赖加载异常,直接影响数据库连接配置的生效:

修改pom.xml中的依赖和仓库配置:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <!-- 替换为与Spring Boot 2.2.x兼容的正式版 -->
    <dependency>
        <groupId>io.r2dbc</groupId>
        <artifactId>r2dbc-mssql</artifactId>
        <version>1.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-r2dbc</artifactId>
        <version>1.0.1.RELEASE</version>
    </dependency>
    <!-- 其他依赖保持不变 -->
</dependencies>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
    <!-- 若无需快照依赖可移除下面的仓库,否则开启快照下载 -->
    <repository>
        <id>spring-libs-snapshot</id>
        <url>https://repo.spring.io/libs-snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

二、修正SQL Server端口配置

SQL Server默认端口是1433,你代码里写的1453除非是特意修改过的自定义端口,否则会直接导致连接失败:

@Bean
@Override
public MssqlConnectionFactory connectionFactory() {
    log.info("Creating SQL Server connection to host: {}", host);
    return new MssqlConnectionFactory(MssqlConnectionConfiguration.builder()
            .host(host)
            .port(1433) // 修正为默认端口,若自定义过则保持你的配置
            .database(database)
            .username(username)
            .password(password)
            .build());
}

三、添加错误处理,暴露真实异常

你的初始化代码里使用了subscribe()但没有处理错误分支,导致数据库操作的异常被静默吞掉,根本看不到真正的连接错误:

@PostConstruct
public void init() {
    log.info("Initializing database if necessary");
    personRepository.findAll().count()
            .subscribe(count -> {
                if (count == 0) {
                    log.info("Database is empty, inserting sample data");
                    createPerson("Josh", "Long", "Pivotal");
                    createPerson("Julien", "Dubois", "Microsoft");
                } else {
                    log.info("Database is already initialized");
                }
            }, error -> {
                // 添加错误日志,终于能看到真实问题了!
                log.error("Failed to initialize database", error);
            });
}

private void createPerson(String firstName, String lastName, String company) {
    Person person = new Person();
    person.setFirstName(firstName);
    person.setLastName(lastName);
    person.setCompany(company);
    personRepository.save(person)
            .log()
            .subscribe(
                    saved -> log.info("Saved person: {}", saved),
                    error -> log.error("Failed to save person", error)
            );
}

四、验证控制器与连接工厂的有效性

如果还是出现404,需要确认控制器是否被正确实例化,连接工厂是否被创建:

  1. 在控制器构造函数中添加日志:
public PersonController(PersonRepository personRepository) {
    this.personRepository = personRepository;
    log.info("PersonController initialized successfully");
}
  1. 确保application.properties中的配置正确:
spring.data.mssql.host=你的数据库地址
spring.data.mssql.database=目标数据库名
spring.data.mssql.username=数据库账号
spring.data.mssql.password=数据库密码

最后检查环境配置

  • 确认SQL Server允许远程连接,防火墙开放了对应端口
  • 确认SQL Server开启了混合认证模式(支持账号密码登录)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:38:12