Преобразователи MongoDB для смешанной коллекции полиморфных типов

#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