#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. Спасибо за ответ. Я попробую это сделать.