I have a complex xml type with a nested element whose name is the same as the parent, but when I serialize it the nested element gets set as the text of the parent when it is included in another element.
The DTOs looks like this:
@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;}
My XmlMapper configuration:
XmlMapper xmlMapper = XmlMapper.xmlBuilder() .defaultUseWrapper(false) .serializationInclusion(NON_NULL) .build();xmlMapper.getFactory() .getXMLOutputFactory() .setProperty("javax.xml.stream.isRepairingNamespaces", false);
When I serialize an Address on it's own, I get the expected value:
<address><address>123 East Street</address><city>metropolis</city></address>
But when I serialize an Address as a nested object of another DTO, like Person, then the address property is serialized as text of the Address parent object.
Actual XML:
<person><address>123 East Street<city>metropolis</city></address></person>
Expected XML:
<person><address><address>123 East Street</address><city>metropolis</city></address></person>
I already know that this is just bad XML design, but that is what I have to do!
Any ideas on how to get the expected XML output?
Edits
I found a workaround by creating another DTO with a "value" field marked as text.
@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}