RestTemplate XML десериализует ноль на пустом теге с атрибутами - PullRequest
0 голосов
/ 07 марта 2019

У меня следующий ответ, когда значения находятся в атрибутах, а тег my не имеет значений, кроме атрибутов (также уровень и my могут иметь несколько значений)

<main>
<level id="1">
<my id="111" amount="100000.00"/>
</level>
<level id="2">
<my id="121" amount="5000.00"/>
</level>
<level id="3">
<my id="122" amount="500.00"/>
</level>
</main>

При попытке десериализации my равно нулю

  ResponseEntity<RequestVO> jackpotFeederResponse = restTemplate.exchange(uriBuilder.build(), HttpMethod.GET,
                    HttpEntity.EMPTY, RequestVO.class);

Я пытаюсь добавить разные DeserializationFeature, но не удалось

            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
            objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, true);
            objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);
            converter.setObjectMapper(objectMapper);
            restTemplate.getMessageConverters().add(converter);

Мои POJO:

@XmlRootElement(name = "main", namespace = "")
@Data
public class RequestVO implements Serializable  {

    private static final long serialVersionUID = -1382015668147149795L;

    @JacksonXmlProperty(localName = "level")
    ArrayList<LevelVO> levelList;
}


@XmlRootElement(name = "level", namespace = "")
@Data
public class LevelVO implements Serializable {

    private static final long serialVersionUID = -1382015668147149795L;

    @JacksonXmlProperty(localName = "id", isAttribute = true)
    String id;
    @JacksonXmlProperty(localName = "my")
    ArrayList<MyVO> myList;


@XmlRootElement(name = "my", namespace = "")
@Data
public class MyVO implements Serializable  {

    private static final long serialVersionUID = -1382015668147149795L;

    @JacksonXmlProperty(localName = "id", isAttribute = true)
    String id;

1 Ответ

1 голос
/ 11 марта 2019

Прежде всего вы должны использовать @JacksonXmlElementWrapper(useWrapping = false) в типах вашей коллекции. Далее постарайтесь не смешивать аннотации JAXB с аннотациями Джексона. Поэтому просто используйте @JacksonXmlRootElement вместо @ XmlRootElement.

Ваши XML POJO должны выглядеть следующим образом:

@JacksonXmlRootElement(localName = "main")
@Data
public class RequestVO implements Serializable {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "level")
    ArrayList<LevelVO> levelList;
}


@JacksonXmlRootElement(localName = "level")
@Data
public class LevelVO implements Serializable {
    @JacksonXmlProperty(localName = "id", isAttribute = true)
    String id;

    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "my")
    ArrayList<MyVO> myList;
}

@JacksonXmlRootElement(localName = "my")
@Data
public class MyVO implements Serializable {
    @JacksonXmlProperty(localName = "id", isAttribute = true)
    String id;

    @JacksonXmlProperty(localName = "amount", isAttribute = true)
    String amount;
}

Если вы действительно хотите придерживаться, используйте аннотацию @XmlRootElement. Возможно, вам также придется зарегистрировать JaxbAnnotationModule для Jacksons XmlMapper:

JaxbAnnotationModule module = new JaxbAnnotationModule();
xmlMapper.registerModule(module);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...