首页 > 解决方案 > 使用 Spring Data 将对象转换为任意对象

问题描述

我正在尝试将任意对象保存到 MongoDB 存储库。类可以是任何东西:

data class MyClass(val someValue: String)

如果我创建一个将类转换MyClass为字符串的转换器,它会被 Spring 拾取并无缝转换:

@Bean
fun myClassToString(): Converter<MyClass, String> = Converter {
    it.someValue
}

// ...

val object = MyClass("whatever")
repository.save(object) // Will be saved as a String, "whatever"

但是,如果我尝试将其转换为 DBObject(或任何其他 POJO),尽管 Spring 看到了 Converter Bean,但它不会调用它:

@Bean
fun myClassToObject(): Converter<MyClass, DBObject> = Converter {
    BasicDBObject(mapOf("theValue" to it.value))
}

// ...

val object = MyClass("whatever")
repository.save(object)

// Will be saved as:
{
  "someValue": "whatever"
}
// not under the field "theValue".

如果我尝试将其转换为其他任意对象,也会发生同样的情况:

fun myClassToOther(): Converter<MyClass, OtherClass>

或直接到地图:

fun myClassToMap(): Converter<MyClass, Map<String, Any>>

转换器都是在MongoCustomConversionsBean 中创建和注册的:

@Bean
fun customMongoConversions(customConverters: List<Converter<out Any, out Any>>): MongoCustomConversions {
    return MongoCustomConversions(customConverters)
}

我知道他们已经注册并转换为String他们工作的证明。据我所知,这遵循此处显示的示例。唯一的区别是我要转换的对象不是直接@Document的,而是子对象。换句话说,它更像是:

val object = Document(MyClass("whatever"))
repository.save(object)

我看不出这应该如何改变任何东西(编辑:它没有;Converter<Document, DBObject>也不起作用)。

一个StdSerializerwith@JsonSerialize也不起作用。我意识到这些琐碎的例子可以通过其他方式完成,但我正在寻找转换器的灵活性。更具体地说,我正在尝试序列化一个带有 a 的对象Class<T>

我是否在某处遗漏了一些注释或一些 Spring 配置?

标签: springmongodbkotlinspring-data

解决方案


推荐阅读