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
相关产品推荐
相关产品推荐

