【问题标题】:Apache CXF JAXB Marshaller not marshalling @XmlAttribute correctlyApache CXF JAXB Marshaller 未正确编组 @XmlAttribute
【发布时间】:2019-10-20 21:46:56
【问题描述】:

我正在尝试从我的基于 CXF 版本 3.1 的 Java REST 服务获取 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 选项,但我无法使用。有人可以帮忙看看我的代码有什么问题或缺少什么吗?

提前致谢

【问题讨论】:

  • @bdoughan,对此有何建议?

标签: java xml jaxb cxf xml-attribute


【解决方案1】:

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

问题

问题是 apache cxf 默认编组器,即 JAXB 不尊重属性注释,因此将字段表示为元素而不是属性。

解决方案

由于默认的序列化和反序列化机制,即 JAXB 不起作用,因此我们需要覆盖它。 在这里,我的问题通过使用 Jackson 作为序列化和反序列化 api 得到了解决。

Jackson 从 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多