Apache CXF JAXB Маршаллер неправильно распределяет @XmlAttribute правильно - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь получить ответ XML от моей службы REST на основе CXF версии 3.1 в java в следующем формате.

<root>
 <element a="X" b="1.2" c="3.2"/>
 <element a="Y" b="5.5" c="1.4"/>
 <element a="Z" b="54.2" c="55.4"/>
</root>

Я определил свой DTO следующим образом:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="root")
public class Root{

    private List<Element> element;

    ---getters setters and no arg constructor--
}
@XmlType(propOrder = {
    "a","b","c"})
@XmlRootElement(name="element")
public class Element{

    @XmlAttribute
    private String a;

    @XmlAttribute
    private Double b;

    @XmlAttribute
    private Double c;

    ---Getter Setter---

}

Я не переопределил ни одного преобразователя, поэтому по умолчанию CXF JAXB xml mapper работает.

Но мой xml-ответ выглядит так: -

<root>
   <element>
      <element>
          <a>X</a>
          <b>1.2</b>
          <c>3.2</c>
       </element>
       <element>
          <a>Y</a>
          <b>5.5</b>
          <c>1.4</c>
       </element>
       <element>
          <a>Z</a>
          <b>54.2</b>
          <c>55.4</c>
       </element>
    </element>
</root>

Я проверилОпция Moxy API, но я не могу использовать.Может кто-нибудь помочь, пожалуйста, что не так с моим кодом или чего не хватает?

Заранее спасибо

1 Ответ

0 голосов
/ 24 июня 2019

Потратив довольно много времени, я нашел проблему и затем нашел решение.

Задача

Проблема заключалась в том, что apache cxf по умолчанию маршаллер, то есть JAXB не учитывал аннотации атрибутов и, следовательно, репрезентировал поля как элементы вместо атрибутов.

Решение

Поскольку по умолчанию механизм сериализации и десериализации, т. Е. JAXB, не работал, поэтому мы должны переопределить это. И здесь моя проблема была решена путем использования Джексона в качестве API для сериализации и десериализации.

Джексон, начиная с версии 2.0, предоставляет как JSON, так и XML-форматы, а также предоставляет специфические для xml аннотации к ним.

Использование @JacksonXmlProperty с атрибутом, установленным в значение true, и затем переопределение компонента ObjectMapper, как показано ниже, решило проблему.

@Bean
    public ObjectMapper objectMapper(){
        ObjectMapper objectMapper= new ObjectMapper();
        //overriding apache cxf JAXB mapper to use jackson mapper.
        AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
        objectMapper.setAnnotationIntrospector(introspector);
        return objectMapper;
...