Apache CXF JAXB编组器未正确编组@XmlAttribute

时间:2019-06-05 11:23:50

标签: java xml jaxb cxf xml-attribute

我正在尝试以以下格式从基于CXF 3.1版的REST服务中以Java格式获取XML响应。

<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映射器正在运行。

但是我的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 :(得分:0)

花了很多时间之后,我发现了问题,然后又想出了解决方案。

问题

问题在于,默认情况下,Apache cxf封送处理程序,即JAXB不遵守属性注释,因此将字段表示为元素而不是属性。

解决方案

由于默认情况下序列化和反序列化机制(即JAXB无法正常工作),因此我们需要对此进行覆盖。 在这里,我的问题通过使用Jackson作为序列化和反序列化api得以解决。

从2.0版本开始的杰克逊既提供JSON格式又提供XML格式,并公开了针对xml的特定注释。

使用@JacksonXmlProperty并将属性设置为true,然后按如下所示覆盖ObjectMapper bean解决了该问题。

@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;