gpt4 book ai didi

java - Apache CXF JAXB Marshaller 未正确编码 @XmlAttribute

转载 作者:行者123 更新时间:2023-12-02 04:48:46 25 4
gpt4 key购买 nike

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

提前致谢

最佳答案

花了相当长的时间,我发现了问题,然后也找到了解决方案。

问题

问题是 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;

关于java - Apache CXF JAXB Marshaller 未正确编码 @XmlAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56459531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com