我有一个复杂的xml类型,其嵌套元素的名称与父元素相同,但是当我对其进行序列化时,当嵌套元素包含在另一个元素中时,该嵌套元素将被设置为父元素的文本。
DTO看起来像这样:
@JacksonXmlRootElement(localName = "address")
public class Address{
@JacksonXmlText(false)
@JsonProperty
private String address;
@JsonProperty
private String city;
//getters and setters
}
@JacksonXmlRootElement(localName = "person")
public Person {
private String name;
private Address address;
}
我的XmlMapper配置:
XmlMapper xmlMapper = XmlMapper.xmlBuilder()
.defaultUseWrapper(false)
.serializationInclusion(NON_NULL)
.build();
xmlMapper.getFactory()
.getXMLOutputFactory()
.setProperty("javax.xml.stream.isRepairingNamespaces", false);
当我自己序列化一个地址时,我得到了预期的值:
<address><address>123 East Street</address><city>metropolis</city></address>
但是当我将一个地址序列化为另一个DTO的嵌套对象(如“人”)时,则将address属性序列化为“地址”父对象的文本。
实际XML:
<person><address>123 East Street<city>metropolis</city></address></person>
期望的XML:
<person><address><address>123 East Street</address><city>metropolis</city></address></person>
我已经知道这只是XML设计上的错误,但这是我必须要做的!
关于如何获得预期的XML输出的任何想法吗?
我找到了一种解决方法,方法是创建另一个DTO,将其“ value”字段标记为文本。
@JacksonXmlRootElement(localName = "address")
public class StreetAddress{
@JacksonXmlText
private String value;
//getters and setters
}
//snip
@JacksonXmlRootElement(localName = "address")
public class Address{
@JsonProperty
private StreetAddress address;
@JsonProperty
private String city;
//getters and setters
}
答案 0 :(得分:1)
按如下所示连接DTO时,将产生预期的XML输出。我使用了2.10
和jackson-annotations
的{{1}}版本。除了额外的getter和setter之外,代码没有任何区别。
jackson-dataformat-xml
输出
Address a = new Address();
a.setCity("metropolis");
a.setAddress("123 East Street");
Person p = new Person();
p.setAddress(a);
xmlMapper.writeValue(new PrintWriter(System.out), p);