Как получить правильный тип класса с помощью Kotlin,MongoDB и Jsonschema «oneof»

#mongodb #kotlin #jsonschema

Вопрос:

Мы используем очередь сообщений для получения некоторых событий. Эти события описываются как схема 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"
            ]
          },
        }
      ]
    }
}
 

Описание

Это означает, что у нас могут быть три разных типа партнеров, что также приведет к различным классам в котлине. Мы хотим сохранить их в нашей базе данных (mongodb).

Позже мы хотим перенести их в другое приложение через REST.

Проблема

Теперь у нас проблема в том, что мы не знаем, как определить, какой тип нам нужно сохранить в базе данных, когда мы получаем сообщение о событии.

В других проектах у нас есть что-то вроде

message.getBody(messageClass)

Но как получить правильный класс сообщений с информацией в этом случае ?

И далее подробнее о том, как мы получим правильный тип из базы данных позже.

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

Может ли Партнер быть абстрактным классом, и когда, как spring data знает, какую правильную реализацию использовать ?

Ответ №1:

В everit-org/json-schema библиотеке есть функция под названием ValidationListener, которая сообщает о событиях во время проверки, включая "oneOf" совпадения подсхем, поэтому, вероятно, она предоставляет достаточно информации для определения класса сообщения.

Точнее, если вы запустите проверку с ValidationListener настроенным, вы получите #combinedSchemaMatch(CombinedSchemaMatchEvent) событие, и событие #getSchema() вернет обертку "oneOf" , а также #getSubSchema() вернет фактически подобранную подсистему (которая сообщит вам класс сообщения).

Библиотека написана на java, поэтому вы можете использовать ее из котлина.

Отказ от ответственности: Я хранитель библиотеки.

Комментарии:

1. Спасибо за ответ. Я попробую это сделать.