如何使用 Kotlin、MongoDB 和 Jsonschema "oneof" 获得正确的 Class 类型

How to get correct Type of a Class using Kotlin,MongoDB and Jsonschema "oneof"

我们正在使用消息队列来获取一些事件。这些事件被描述为这样的 json 模式。

{
  "title": "Partner",
  "type": "object",
  "properties": {
    "partnerID": {
      "type": "string",
      "examples": [
        "0001038645"
      ]
    },
    "partnerTyp": {
      "type": "string",
      "enum": [
        "NATPERS",
        "PAAR",
        "SONST-JURIST"
      ],
      "examples": [
        "SONST-JURIST"
      ]
    },
    "name": {
      "oneOf": [
          "vorname": {
            "type": "string",
            "examples": [
              "Bernd"
            ]
          },
          "nachname": {
            "type": "string",
            "examples": [
              "Wernersen"
            ]
          },
        },
        {
          "vorname1": {
            "type": "string",
            "examples": [
              "Bernd"
            ]
          },
        },
        {
          "nameExtern": {
            "type": "string",
            "examples": [
              "Internationale Pinsel Manufaktur Gesellschaft mbH"
            ]
          },
        }
      ]
    }
}

描述

这意味着我们可以拥有三种不同类型的合作伙伴,这也会在 kotlin 中产生不同的 classes。我们想将它们保存在我们的数据库中 (mongodb)。

稍后我们希望通过 REST 将它们转移到另一个应用程序。

问题

我们现在遇到的问题是,当我们从事件中获取消息时,我们不知道如何确定我们需要在数据库中保存哪种类型。

在其他项目中,我们有类似的东西

message.getBody(messageClass)

但是如何在这个事件中得到正确的消息 class with Information 呢?

以及稍后我们如何从数据库中获取正确类型的更多信息。

interface ContractRepository : MongoRepository<Partner, String> {
    override fun deleteAll()
} 

Partner 可以是一个抽象的 class 什么时候 spring 数据如何知道要使用什么是正确的实现?

everit-org/json-schema 库有一个名为 ValidationListener 的功能,它在验证期间报告事件,包括 "oneOf" 子模式匹配,因此它可能为您提供足够的信息来确定消息 class.

更准确地说,如果您 运行 配置了 ValidationListener 的验证,您将收到一个 #combinedSchemaMatch(CombinedSchemaMatchEvent) 事件,并且该事件的 #getSchema() 将 return 包装 "oneOf",而 #getSubSchema() 将 return 实际匹配的子模式(它将告诉您消息 class)。

该库是用 java 编写的,因此您可以在 kotlin 中使用它。

免责声明:我是库的维护者。