【问题标题】:How to get correct Type of a Class using Kotlin,MongoDB and Jsonschema "oneof"如何使用 Kotlin、MongoDB 和 Jsonschema “oneof”获取正确的类类型
【发布时间】:2021-08-10 07:30:43
【问题描述】:

我们正在使用消息队列来获取一些事件。这些事件被描述为这样的 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 中产生不同的类。我们想将它们保存在我们的数据库(mongodb)中。

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

问题

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

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

message.getBody(messageClass)

但是如何在这个事件中获得正确的信息类呢?

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

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

Partner 可以是一个抽象类吗?spring data 什么时候知道正确的实现是什么?

【问题讨论】:

    标签: mongodb kotlin jsonschema


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多