Spring Data Redis OM Kotlin环境下投影(选择性获取字段)支持问题及返回Null求助
Spring Data Redis OM Kotlin环境下投影(选择性获取字段)支持问题及返回Null求助
我来帮你梳理下这个问题哈,先给你吃个定心丸:Redis OM Spring是完全支持Kotlin环境下的投影(选择性字段查询)功能的,你提到的这个功能确实已经在新版本中得到了完善支持,不用怀疑这个核心点。
接下来咱们针对你遇到的「查询返回Null但Redis里有数据、FT.SEARCH查询正确」的问题,一步步排查:
一、先确认投影的实现方式是否正确
Kotlin环境下的投影接口定义需要符合Redis OM的要求,举个例子:
假设你的Flight文档是Kotlin数据类:
@RedisDocument data class Flight( @Id val id: String? = null, val flightNumber: String, val origin: String, val destination: String, val departureTime: Instant )
那对应的投影接口应该这么写(用Kotlin接口的val属性,和文档字段一一对应):
interface FlightProjection { val flightNumber: String val origin: String // 只保留你需要查询的字段 }
然后在Repository中使用这个投影:
interface FlightRepository : RedisDocumentRepository<Flight, String> { fun findByFlightNumberContaining(flightNumber: String): List<FlightProjection> }
如果投影接口写法不符合规范,Redis OM可能无法正确映射字段,导致反序列化后返回Null。
二、排查序列化/反序列化配置问题
你已经配置了JacksonConfig,但需要确认几点:
- 你的
ObjectMapper是否被Redis OM正确复用?Redis OM Spring默认会使用Spring容器中的ObjectMapperBean,要确保这个Bean是全局生效的。 - 检查序列化组件的兼容性:你的依赖中同时有Jackson的Kotlin模块、Ktor的序列化、Kotlinx Serialization,可能存在序列化冲突。建议:
- 确保
jackson-module-kotlin的版本和Spring Boot的Jackson版本对齐(你用的Spring Boot 3.5.4对应的Jackson版本是2.19.x,当前2.19.2是没问题的,但最好通过Spring Boot的依赖管理引入,避免版本冲突) - 若使用Kotlinx Serialization,需确认Redis OM是否适配;更稳妥的方式是统一用Jackson处理Redis文档的序列化
- 确保
三、结合你的依赖配置的具体排查点
从你给出的libs.versions.toml和依赖配置来看:
- Redis OM Spring的版本是
1.0.0,这个版本支持Kotlin投影,但可以尝试升级到最新稳定版(比如1.2.0),修复可能存在的小Bug - 你的Spring Boot版本是
3.5.4,要确保Redis OM Spring的版本和Spring Boot 3.x兼容(1.0.0+版本均兼容Spring Boot 3) - 检查Kotlinx DateTime的配置:你用了
kotlinx-datetime,如果Flight文档中有日期类型字段,需要确保Jackson能正确序列化/反序列化Instant或LocalDateTime,可以添加jackson-module-kotlinx-datetime依赖:
implementation("com.fasterxml.jackson.module:jackson-module-kotlinx-datetime:2.19.2")
然后在JacksonConfig中注册这个模块:
@Bean fun objectMapper(): ObjectMapper { return jacksonObjectMapper() .registerModule(KotlinModule.Builder().build()) .registerModule(KotlinxDateTimeModule()) }
四、开启调试日志定位问题
如果以上步骤都没问题,建议开启Redis OM的DEBUG日志,看看反序列化过程中有没有隐藏的异常:
在application.yml或application.properties中添加:
logging: level: com.redis.om: DEBUG
这样你就能看到Redis OM执行查询、反序列化的详细日志,找到返回Null的具体原因(比如字段类型不匹配、反序列化失败等)
总结下:Redis OM Spring绝对支持Kotlin的投影功能,你遇到的Null问题大概率是投影定义、序列化配置或依赖冲突导致的,按照上面的步骤一步步排查应该就能解决啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

