проблема при десериализации xml с помощью xmlMapper (java)

#java #xml #serialization #jackson

Вопрос:

У меня есть автоматически созданные POJOs, в которые я хочу десериализовать XML. XML выглядит следующим образом:

 <RootElement>
  <ListOfEntities>
    <Entity>
      <EntityRecord>
        <Field>123</Field>
      </EntityRecord>
    </Entity>
  </ListOfEntities>
<RootElement>
 

автоматически генерируемые объекты выглядят следующим образом:

 @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "listOfEntitiesType", propOrder = {
    "entity"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class ListOfEntitiesType {

    @XmlElement(name = "Entity")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
    protected List<EntityType> entity;
.....
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entityType", propOrder = {
    "entityRecord"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class EntityType {

    @XmlElement(name = "EntityRecord")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
    protected List<EntityRecordType> entityRecord;
.....
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entityRecordType", propOrder = {
    "field"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class EntityRecordType {

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
    protected String field;
.....
}
 

и корневой элемент.

Я пытаюсь десериализовать его с помощью этого кода:

 XmlMapper xmlMapper = XmlMapper.builder().enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES).build();
xmlMapper.readValue()
 

И я получаю ошибку:

 Unrecognized field "field" (class path.to.autogenerated.classes.EntityType), not marked as ignorable (one known property: "entityRecord"])
 

Похоже, что когда Джексон пытается десериализовать ListOfEntities, он интерпретирует тег как своего рода оболочку элемента списка, поэтому он пытается интерпретировать его как элемент списка. И терпит неудачу

Я попытался написать такой код:

 XmlMapper xmlMapper = XmlMapper.builder().defaultUseWrapper(false).enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES).build();
xmlMapper.readValue()
 

но безрезультатно.

У меня нет доступа ни к использованию аннотаций в POJOs (потому что они автоматически генерируются), ни к внесению изменений в xsd. Могу ли я как-то сказать xmlMapper, чтобы он правильно десериализовался?

Ответ №1:

Мне кажется, что вы упускаете @XmlAttribute из виду следующее:

 @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entityRecordType", propOrder = {
    "field"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
public class EntityRecordType {

    @XmlAttribute(name = "Field")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2021-09-23T01:56:05 03:00", comments = "JAXB RI v2.3.3")
    protected String field;
.....
}
 

Комментарии:

1. нет, в полях самого низкого класса есть только @Сгенерированная аннотация.

2. И этот класс автоматически генерируется, поэтому я не могу добавить никаких аннотаций

3. Как вы его автоматически генерируете?