У меня есть структура сущностей, где один класс, уже на несколько уровней ниже 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 о ее решении.