Spring Boot连接GCP Spanner时SpannerRepository的findById返回空
解决Spring Data Spanner findById返回null及代理报错问题
排查步骤及解决方案:
确认目标数据存在
直接登录GCP Spanner控制台,在FileImportStats表中用传入的fileImportId执行查询,确认数据是否真实存在。返回null最常见的原因就是数据本身不存在。校验主键映射正确性
- 检查Spanner表的主键列名
FileImportId与实体类的@Column(name = "FileImportId")大小写完全一致,Spanner默认区分大小写,列名不匹配会导致查询无结果。 - 确认Spanner表主键列的类型为
STRING,与实体类的String fileImportId类型匹配,类型不兼容会导致无法匹配数据。
- 检查Spanner表的主键列名
定位代理报错的真实根因
jdk.proxy2.$Proxy146.findById(unknown Source)只是代理类的堆栈信息,不是真正错误原因,需要查看完整堆栈的Caused by部分:- 检查服务账号权限:确保连接Spanner的服务账号拥有
roles/spanner.databaseReader权限,无读取权限会导致查询失败返回null。 - 核对数据库配置:确认
application.yml/application.properties中的Spanner实例ID、数据库名称配置正确,示例配置:spring.cloud.gcp.spanner.instance-id=your-spanner-instance spring.cloud.gcp.spanner.database=your-database-name - 检查实体类字段映射:除主键外,其他字段的
@Column注解列名、类型需与Spanner表完全匹配,比如Spanner的INT64对应实体类的Long而非Integer,字段映射错误会导致无法构造实体返回null。
- 检查服务账号权限:确保连接Spanner的服务账号拥有
确认仓库接口继承正确
确保FileImportStatsRepository继承的是org.springframework.cloud.gcp.data.spanner.repository.SpannerRepository,不要误继承Spring Data JPA或其他类型的Repository接口。开启日志调试
添加日志配置查看实际执行的SQL,确认参数和语句是否正确:logging.level.org.springframework.cloud.gcp.data.spanner=DEBUG logging.level.com.google.cloud.spanner=DEBUG日志中会打印生成的查询SQL,可直接复制到Spanner控制台执行,验证是否能返回数据。
校验依赖版本兼容性
确保Spring Boot与Spring Cloud GCP版本兼容,比如Spring Boot 3.x需搭配Spring Cloud GCP 4.x版本,版本不兼容会导致代理类生成异常或方法调用失败。
内容的提问来源于stack exchange,提问作者smartCoder
相关产品推荐
相关产品推荐

