package com.fasterxml.jackson.dataformat.xml.misc; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlTestBase; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; // for #12 public class UnwrappingWithXMLTest extends XmlTestBase { @JsonPropertyOrder({"x", "y"}) final static class Location { public int x; public int y; public Location() { } public Location(int x, int y) { this.x = x; this.y = y; } } // IMPORTANT: ordering DOES matter here @JsonPropertyOrder({ "name", "location" }) static class Unwrapping { public String name; @JsonUnwrapped(prefix="loc.") public Location location; public Unwrapping() { } public Unwrapping(String str, int x, int y) { name = str; location = new Location(x, y); } } static class UnwrappingWithAttributes{ @JacksonXmlProperty(isAttribute=true) public String name; @JacksonXmlProperty(isAttribute=true) @JsonUnwrapped(prefix="loc.") public Location location; public UnwrappingWithAttributes() { } public UnwrappingWithAttributes(String str, int x, int y) { name = str; location = new Location(x, y); } } static class UnwrappingSubWithAttributes{ @JacksonXmlProperty(isAttribute=true) public String name; @JsonUnwrapped(prefix="loc.") public LocationWithAttributes location; public UnwrappingSubWithAttributes() { } public UnwrappingSubWithAttributes(String str, int x, int y) { name = str; location = new LocationWithAttributes(x, y); } } @JsonPropertyOrder({"x", "y"}) final static class LocationWithAttributes { @JacksonXmlProperty(isAttribute=true) public int x; public int y; public LocationWithAttributes() { } public LocationWithAttributes(int x, int y) { this.x = x; this.y = y; } } /* /********************************************************** /* Tests /********************************************************** */ /** * Simple test to verify that explicit schema mapping works fine * with unwrapped entities */ public void testSimpleUnwrappingRoundtrip() throws Exception { final String XML = "<Unwrapping><name>Joe</name><loc.x>15</loc.x><loc.y>27</loc.y></Unwrapping>"; ObjectMapper mapper = xmlMapper(false); Unwrapping wrapper = mapper.readerFor(Unwrapping.class).readValue(XML); assertNotNull(wrapper); assertNotNull(wrapper.location); assertEquals(15, wrapper.location.x); assertEquals(27, wrapper.location.y); // should also write out the same way assertEquals(XML, mapper.writerFor(Unwrapping.class).writeValueAsString(wrapper)); } public void testUnwrappingWithAttribute() throws Exception { final String XML = "<UnwrappingWithAttributes name=\"Joe\" loc.x=\"15\" loc.y=\"27\"/>"; ObjectMapper mapper = xmlMapper(false); UnwrappingWithAttributes wrapper = mapper.readerFor(UnwrappingWithAttributes.class).readValue(XML); assertNotNull(wrapper); assertNotNull(wrapper.location); assertEquals(15, wrapper.location.x); assertEquals(27, wrapper.location.y); // should also write out the same way assertEquals(XML, mapper.writerFor(UnwrappingWithAttributes.class).writeValueAsString(wrapper)); } public void testUnwrappingSubWithAttribute() throws Exception { final String XML = "<UnwrappingSubWithAttributes name=\"Joe\" loc.x=\"15\"><loc.y>27</loc.y></UnwrappingSubWithAttributes>"; ObjectMapper mapper = xmlMapper(false); UnwrappingSubWithAttributes wrapper = mapper.readerFor(UnwrappingSubWithAttributes.class).readValue(XML); assertNotNull(wrapper); assertNotNull(wrapper.location); assertEquals(15, wrapper.location.x); assertEquals(27, wrapper.location.y); // should also write out the same way assertEquals(XML, mapper.writerFor(UnwrappingSubWithAttributes.class).writeValueAsString(wrapper)); } }