包含其他类型的Kotlin类类型

gdx19jrr  于 2023-02-24  发布在  Kotlin
关注(0)|答案(1)|浏览(102)

有一个名为Product的Mongo文档,一个产品有许多ProductOption,选项的类型从1到5。属性类型因其选项类型而异(示例如下)。
我想做的是定义下面的QuestionThisType。你能给我推荐一下吗?

@Document("Product")
data class Product(
    val id: Int,
    val options: List<ProductOption>,
) {
    data class ProductOption(
        val type: Int,
        val properties: QuestionThisType
    )
}

如果类型== 1,则

data class Property1(
   val one: String
)

如果类型== 2,则

data class Property2(
   val a: String,
   val b: String,
)
...
58wvjzkj

58wvjzkj1#

这可能对您有用-创建您自己的Spring Data 转换器
首先,想象一种 * 通用 * 的方法,将ProductOption的数据存储在Mongo可以表示的数据类型中,例如Map<String,Any>包含嵌套的Map<String,Any>

@Document("Product")
data class Product(
    val id: Int,
    val options: List<ProductOption>,
)

现在,您需要一个接口将类型1、2、3、4、5的实际ProductOptions链接在一起,然后为每个类型链接具体的类

interface ProductOption {
    val type: Int
    val properties: Any
}

data class ProductOption1(
    override val type: Int = 1,
    override val properties: Property1,
) : ProductOption {
    data class Property1(
        val one: String,
    )
}

data class ProductOption2(
    override val type: Int = 2,
    override val properties: Property2,
) : ProductOption {
    data class Property2(
        val a: String,
        val b: String,
    )
}

etc...

然后,您需要创建一个转换器,它接受这些实现ProductOption的具体类,并将它们与存储在Mongo中的内容进行转换:ProductOptionGeneral

import org.springframework.core.convert.converter.Converter
import org.springframework.data.convert.ReadingConverter
import org.springframework.data.convert.WritingConverter

class MapToProductOptionConverter : Converter<Map<String,Any>, ProductOption> {
    override fun convert(source: Map<String,Any>): ProductOption? {
        val properties = source["properties"] as Map<String, Any>
        when (source["type"] as Int) {
            1 -> {
                ProductOption1(
                    properties = ProductOption1.Property1(
                        one = properties["one"] as String
                    )
                )
            }
            else -> TODO()
        }
    }
}

@WritingConverter
class ProductOptionToMapConverter : Converter<ProductOption, Map<String,Any>> {
    override fun convert(source: ProductOption): Map<String,Any>? {
        TODO()
    }
}

最后注册您的转换器

@Configuration
@EnableMongoRepositories
class MongoConfig {

    @Bean
    fun customConversions(): MongoCustomConversions {
        return MongoCustomConversions(
            listOf(
                MapToProductOptionConverter(),
                ProductOptionToMapConverter(),
            )
        )
    }

(If你曾经问过如何将JSON反序列化处理成一个多态类结构,这可以用一种简单得多的方式实现。这对你来说可能是一种完全不同的方法。你可以从Mongo中检索数据作为一个BSON对象,转换成JSON,然后按照我在Stackoverflow Answer中描述的方式使用Jackson的ObjectMapper:https://stackoverflow.com/a/72106352/1847378

相关问题