我正在尝试以以下格式从基于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选项,但是我不能使用。有人可以帮我解决我的代码有问题或缺少什么吗?
预先感谢
答案 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;