Аннотации JAXB не работают с конвертером сообщений Jackson

У меня есть весенний веб-проект, в котором я обновил несколько банок, путь к классам имеет банки формата данных JAXB и Jackson XML. Я пытаюсь получить ожидаемый вывод XML от моего контроллера с помощью конвертера XML-сообщений Jackson, но аннотации JAXB не работают. Может кто-нибудь помочь?

package-info.java

@XmlSchema(xmlns = { 
    @XmlNs(prefix = "ac", namespaceURI = "http://www.example.com/ABC") 
    })
package com.example;

UserDemographics.java

@XmlRootElement(name = "user-demographics", namespace = "http://www.example.com/ABC")
@XmlAccessorType(XmlAccessType.FIELD)
public class UserDemographics {

    @XmlElement(name = "demographic", namespace = "http://www.example.com/ABC")
    private Set<Demographic> demographics = new TreeSet<>();

    @XmlAttribute(name="user-id")
    private int userId;

    static class Demographic{
        private String key;
        private String value;

        @XmlAttribute(name = "name")
        public String getKey() { return key; }

        @XmlValue
        public String getValue() { return value; }
    }
}

Ожидаемый результат Работает, если я явно установил Jaxb2RootElementHttpMessageConverter

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ac:user-demographics xmlns:ac="http://www.example.com/ABC" user-id="2">
    <ac:demographic name="ADDRESS">Mall Road</ac:demographic>
    <ac:demographic name="COUNTRY">India</ac:demographic>
</ac:user-demographics>

Неверно, с конвертерами сообщений по умолчанию (используется MappingJackson2XmlHttpMessageConverter)

<UserDemographics xmlns="">
    <demographic>
        <demographic><name>ADDRESS</name><value>Mall Road</value></demographic>
        <demographic><name>COUNTRY</name><value>India</value></demographic>
    </demographic>
</UserDemographics>

Когда я пытаюсь установить AnnotationIntrospector, используя следующий код

@Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    ObjectMapper xmlMapper = Jackson2ObjectMapperBuilder.xml().build();
    xmlMapper.setAnnotationIntrospector(
            AnnotationIntrospector.pair(
                    new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()), 
                    new JacksonAnnotationIntrospector()));
    converters.add(new MappingJackson2XmlHttpMessageConverter(xmlMapper));
  }

Я получаю следующий неверный ответ

<user-demographics xmlns="" xmlns="http://www.example.com/ABC" user-id="2">
    <demographic xmlns:zdef2091338567="" zdef2091338567:name="ADDRESS">Mall Road</demographic>
    <demographic xmlns:zdef112980045="" zdef112980045:name="COUNTRY">India</demographic>
</user-demographics>

person sidgate    schedule 15.06.2017    source источник
comment
Expected output Works when I explicitly set Jaxb2RootElementHttpMessageConverter Кажется, у вас уже есть ответ. Что ты хочешь, чтобы мы сделали?   -  person 11thdimension    schedule 20.06.2017
comment
Как я вижу, у вас есть две проблемы: в одной отсутствует префикс уровня пакета, который не поддерживается, а другой – неверный префикс, который можно разрешить с помощью другая реализация базовой библиотеки stax для xml mapper. Я не вижу второй проблемы с последней версией 2.8.7 xml databind lib, которая по умолчанию использует библиотеку woodstox stax.   -  person s7vr    schedule 20.06.2017
comment
На всякий случай, если вы не знаете, что я думаю, что это не так. Вы всегда можете удалить библиотеку привязки данных xml из пути к классам по умолчанию до Jaxb2RootElementHttpMessageConverter, если это вариант для вас.   -  person s7vr    schedule 20.06.2017
comment
@Veeram относительно того, что префикс уровня пакета не поддерживается, разве модуль jackson-module-jaxb-annotations не должен поддерживать все аннотации JAXB?   -  person sidgate    schedule 22.06.2017
comment
Взгляните на javadocs. Некоторые аннотации еще не поддерживаются. Вы можете посмотреть ранее упомянутый билет для будущих обновлений.   -  person s7vr    schedule 22.06.2017


Ответы (1)


Как я вижу, у вас есть две проблемы: в одной отсутствует префикс уровня пакета, который не поддерживается, а другой – неправильный префикс, который можно разрешить с помощью другой базовой реализации библиотеки stax для сопоставления xml.

Я не вижу второй проблемы с последней версией 2.8.7 xml databind lib, которая по умолчанию использует библиотеку woodstox stax.

Вы всегда можете удалить библиотеку привязки данных xml из пути к классам по умолчанию для Jaxb2RootElementHttpMessageConverter, если это вариант для вас.

Некоторые аннотации еще не поддерживается.

person s7vr    schedule 23.06.2017