#spring-boot #spring-data #spring-data-mongodb
Вопрос:
У меня есть коллекция a mongo, которая содержит элементы одного и того же базового типа. У некоторых из них есть этот _class
атрибут, а у некоторых его нет. Я зарегистрировал конвертер mongo для базового элемента и увидел, что он срабатывает соответствующим образом, когда атрибут _class отсутствует. Для элементов, которые существуют, Spring пытается найти преобразователь для этого элемента подтипа и впоследствии терпит неудачу. Я попытался создать конвертер для объекта подтипа, но я хочу, чтобы он просто использовал поведение «по умолчанию», которое имело бы место.
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
visible = true
)
abstract class ElementBase {}
class myElement: ElementBase{}
Мой конвертер, который работает для элементов без _class
свойства
class ElementConverter : Converter<Document, ElementBase> {
override fun convert(source: Document): ElementBase? {
// maps to object that inherits from element base
val mapper: ObjectMapper = SerializationUtils.buildJacksonObjectMapper()
return mapper.convertValue(source, myElement::class.java)
}
}
Преобразователь для подтипного объекта:
abstract class SurveyElementConverterBase(val applicationContext: ApplicationContext) {
inline fun <reified T: SurveyElement> defaultConvert(source: Document): T {
// One approach, but requires that I add the type attribute to the
// document even if I'm explicitly trying to create a sub type.
// Also has problems if there are nested elements, as those elements
// also require the type attribute.
val mapper: ObjectMapper = SerializationUtils.buildJacksonObjectMapper()
return mapper.convertValue(source, T::class.java)
// Results in a stack overflow
val mongoTemplate: MongoTemplate = applicationContext.getBean(MongoTemplate::class.java)
return mongoTemplate.converter.read(T::class.java, source)
}
}
Могу ли я получить поведение конвертера по умолчанию для использования при наличии свойства _class? Или как настроить конвертер так, чтобы он не думал, что ему нужно использовать пользовательский конвертер, когда он знает подтип?
Пружинная загрузка 2.4 Котлин 1.4.32 Пружинные данные Монго 3.1