Как настроить коллекцию абстрактных классов с JAXB для десериализации в Джексоне? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть структура сущностей, где один класс, уже на несколько уровней ниже root дерева, (PoFoconNetz) имеет поле Set, содержащее экземпляры abstract класс (PoFoconKnoten) с тремя возможными реализациями (PoBAC32, PoBAC12 и PoBAU).

К классам применяются следующие аннотации из пакета javax.xml.bind.annotation.*:

  • К PoFoconNetz: @XmlSeeAlso({ PoBAC32.class, PoBAC12.class, PoBAU.class })
  • К полю Set<PoFoconKnoten> в PoFoconNetz, называемому foconKnoten:
@XmlElementWrapper(name = "foconKnoten")
@XmlElements(value = {
    @XmlElement(name = "PoBAC32", type = PoBAC32.class),
    @XmlElement(name = "PoBAC12", type = PoBAC12.class),
    @XmlElement(name = "PoBAU", type = PoBAU.class) })
  • К абстрактный PoFoconKnoten класс: @XmlSeeAlso({ PoBAC32.class, PoBAC12.class, PoBAU.class })
  • Для трех конкретных подклассов: @XmlRootElement

На стороне отправителя эти классы сериализуются в XML с использованием JAXB ( 2.3.0), для отправки в конечную точку REST, в результате чего XML выглядит следующим образом:

<[...ROOT ITEMS OMITTED...]>
<foconNetz [...ATTRIBUTES...]>
    <foconKnoten>
        <PoBAC12 [...ATTRIBUTES...]>
            <[...FURTHER SUB-ITEMS...]>
        </PoBAC12>
    </foconKnoten>
</foconNetz>

Затем приложение Spring получателя использует Jackson 2.9.9 для восстановления исходного Java лица. Здесь могут быть полезны следующие части, так как они должны включать обработку аннотаций JAXB:

    @Autowired
    private ObjectMapper jacksonObjectMapper;
[...]
    jacksonObjectMapper.registerModule(new JaxbAnnotationModule());
    jacksonObjectMapper.setAnnotationIntrospector(new 
        XmlJaxbAnnotationIntrospector(jacksonObjectMapper.getTypeFactory()));

Но когда отправленное XML поступает на приемную сторону, Джексон выдает ошибку, жалуясь на неспособность создать экземпляр PoFoconKnoten, казалось бы, не обращая внимания на информацию о типе, содержащуюся в XML:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `my.company.product.PoFoconKnoten` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (PushbackInputStream); line: 1, column: 252] (through reference chain: [...VARIOUS OTHER CLASSES...]->my.company.product.PoFoconNetz["foconKnoten"]->java.util.HashSet[0])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.9.9.jar:2.9.9]

Я бы хотел получить любые указатели о том, что может быть причиной проблемы, и как я мог go о ее решении.

...