Hello!
I'm trying to use Jackson to serialize/deserialize values in a format
that has an existing XML schema. I'm having difficulty getting
serialized values to match the schema, and the rather sparse
documentation isn't helping matters. Here's a small example (the
Location and LocationID types are simplified versions of the types
that appear in the real schema):
~~~
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;
public final class SerialDemo2
{
private SerialDemo2()
{
}
record LocationID(UUID id) {
LocationID {
Objects.requireNonNull(id, "id");
}
}
@JacksonXmlRootElement(namespace = "urn:com.io7m.cardant.inventory:1")
record Location(
@JsonProperty(required = true)
@JacksonXmlProperty(isAttribute = true, localName = "id")
LocationID id,
@JsonProperty(required = false)
@JacksonXmlProperty(isAttribute = true, localName = "parent")
LocationID parent
) {
Location {
Objects.requireNonNull(id, "id");
}
}
public static void main(
final String[] args)
throws IOException
{
final var mapper =
XmlMapper.builder()
.build();
System.out.println("Expected: ");
System.out.println();
System.out.println("""
<Location xmlns="urn:com.io7m.cardant.inventory:1"
id="6e3f4213-db36-4ea3-91ba-1ce6917cbcbb"
parent="265f34b3-8c86-4a1f-b23a-bb104238bfc6"/>
""");
System.out.println("Received: ");
System.out.println();
mapper.writeValue(
System.out,
new Location(
new LocationID(UUID.randomUUID()),
new LocationID(UUID.randomUUID())
)
);
System.out.println();
}
}
~~~
The output of the above is:
~~~
Expected:
<Location xmlns="urn:com.io7m.cardant.inventory:1"
id="6e3f4213-db36-4ea3-91ba-1ce6917cbcbb"
parent="265f34b3-8c86-4a1f-b23a-bb104238bfc6"/>
Received:
<Location xmlns="urn:com.io7m.cardant.inventory:1"><id xmlns=""><id>c09fb552-e36c-4213-b56a-7729cd5b7999</id></id><parent xmlns=""><id>58c399ae-0256-4dbd-a00e-0c1c01189559</id></parent></Location>
~~~
I've tried various combinations of the XML properties, and it's not
clear how (or even if) I can use the existing JSON properties to get
the right input/output mapping.
--
Mark Raynsford |
https://www.io7m.com