在Kotlin的Spring Data MongoDB中不使用@Transient忽略属性的最佳方法
解决Spring Data MongoDB忽略DTO非框架依赖字段的问题
针对你的场景,无需让DTO依赖Spring Data MongoDB注解,最简单的实现方式如下:
优先方案:利用Jackson的@JsonIgnore注解
跨服务传输的DTO通常依赖Jackson做JSON序列化,而Spring Data MongoDB默认兼容Jackson的序列化规则。直接给BarDto的ignored字段添加Jackson的@JsonIgnore注解即可:
data class BarDto( val label: String ) { @com.fasterxml.jackson.annotation.JsonIgnore private lateinit var ignored: String init { ignored = if (label.length >= 1) { label.substring(0, 1) } else { "" } } }
这种方式既不会引入Spring Data MongoDB的依赖,又能让Spring Data MongoDB在读写数据库时自动忽略该字段,同时不影响跨服务的JSON传输(Jackson本身会跳过该字段的序列化)。
备选方案:自定义Mongo映射配置(无DTO修改)
如果完全不想修改DTO代码,可以通过配置MappingMongoConverter指定要忽略的字段路径:
- 创建Mongo配置类:
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.data.mongodb.core.convert.MappingMongoConverter import org.springframework.data.mongodb.core.mapping.MongoMappingContext import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity @Configuration class MongoConfig { @Bean fun mappingMongoConverter(mongoMappingContext: MongoMappingContext): MappingMongoConverter { val converter = object : MappingMongoConverter(null, mongoMappingContext) { override fun createPersistentEntity(typeInformation: org.springframework.data.util.TypeInformation<*>): MongoPersistentEntity<*> { val entity = super.createPersistentEntity(typeInformation) // 针对FooHolder的嵌套字段标记忽略规则 if (entity.type == FooHolder::class.java) { // 逐层定位到BarDto的ignored字段,标记为Transient mongoMappingContext.getPersistentEntity(FooDto::class.java)?.let { fooEntity -> fooEntity.getPersistentProperty("bar")?.let { barProp -> mongoMappingContext.getPersistentEntity(BarDto::class.java)?.let { barEntity -> barEntity.getPersistentProperty("ignored")?.isTransient = true } } } } return entity } } return converter } }
这种方式通过在映射上下文里标记ignored字段为 transient,无需修改DTO,但配置代码相对繁琐。
内容的提问来源于stack exchange,提问作者Matthew Adams
相关产品推荐
相关产品推荐

