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

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,但需要确认几点:

  1. 你的ObjectMapper是否被Redis OM正确复用?Redis OM Spring默认会使用Spring容器中的ObjectMapper Bean,要确保这个Bean是全局生效的。
  2. 检查序列化组件的兼容性:你的依赖中同时有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和依赖配置来看:

  1. Redis OM Spring的版本是1.0.0,这个版本支持Kotlin投影,但可以尝试升级到最新稳定版(比如1.2.0),修复可能存在的小Bug
  2. 你的Spring Boot版本是3.5.4,要确保Redis OM Spring的版本和Spring Boot 3.x兼容(1.0.0+版本均兼容Spring Boot 3)
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:19:35