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

R2DBC Postgres连接失败,错误出现<unresolved>,如何修复?

修复R2DBC连接PostgreSQL失败及相关代码问题

核心连接失败问题修复

错误信息中的<unresolved>是因为你在host()方法中传入了完整的R2DBC URL(r2dbc:postgresql://mydb.alfa),但该方法仅需传入纯主机名/IP地址,不需要带协议前缀。错误的参数导致R2DBC无法正确解析数据库名称,因此显示<unresolved>。

修改连接配置类的connectionFactory方法:

@Configuration
@EnableR2dbcRepositories
public class DatabaseConfiguration extends AbstractR2dbcConfiguration {

    @Value("${db.password}") // 建议从配置文件注入密码,避免硬编码
    private String password;

    @Bean
    public PostgresqlConnectionFactory connectionFactory() {
        return new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
            .host("mydb.alfa") // 仅保留主机名,移除r2dbc:postgresql://前缀
            .port(5432)
            .username("admin")
            .database("postgres")
            .password(password)
            .build()
        );
    }
}

其他代码问题修复(避免连接成功后仍报错)

1. 仓库方法命名与返回类型错误

你的仓库接口定义的方法是findTop1By(String name),但控制器中调用的是findTop1ByName(...),方法名不匹配会导致Spring Data无法生成代理实现;同时findTop1返回单个实体,应使用Mono而非处理多结果的Flux。修改仓库接口:

public interface ReactiveOdometerRepository extends ReactiveCrudRepository<OdometerEntity, String> {
    Mono<OdometerEntity> findTop1ByName(String name);
}

2. 控制器阻塞响应式方法调用

控制器中直接调用getValue()是错误的,Mono是异步响应式类型,同步取值会导致空指针或阻塞问题,需改为响应式返回:

@PostMapping(value = "/query", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<Integer> get(@RequestBody RequestObject request) {
    return odometerRepository.findTop1ByName(request.getName())
        .map(OdometerEntity::getValue);
}

3. 实体类注解不完整

实体类仅给单个属性加@Getter,且未指定表名,可能导致Spring Data无法正确映射。修改实体类:

@Getter
@Setter
@Table("odometer") // 指定数据库表名,默认会用类名小写作为表名
public class OdometerEntity {
    @Id
    private String name;
    private int value;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:01:19