FasterXML / FasterXML/jackson-dataformat-xml

Type-safe record wrappers to serialize as XML Attributes

Open
#558 3 comments 1 reaction 0 assignees View on GitHub
record
Dominant language
Java
Stars
631
Forks
246
Avg merge
7d 9h
Merged PRs (30d)
13

Description

**Is your feature request related to a problem? Please describe.**

The following example code uses a trivial wrapper record (`LocationID`) to allow some extra type-safety when working with elements declared in an existing 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("""

""");

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 program ends up as:

```
Expected:

Received:

c09fb552-e36c-4213-b56a-7729cd5b799958c399ae-0256-4dbd-a00e-0c1c01189559
```

The desired output _can_ be produced with the following definitions instead:

```
final class CA1LocationID
{
private final UUID id;

@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public CA1LocationID(
final UUID inId)
{
this.id = Objects.requireNonNull(inId, "id");
}

@JsonValue
@Override
public UUID id()
{
return this.id;
}
}
```

But it's slightly unfortunate that the definitions have to be declared in this way, because we lose a lot of the nice properties of `record` classes in the process.

**Describe the solution you'd like**

I'd like to be able to use records instead of POJOs in the above example.

**Usage example**

See above. :slightly_smiling_face:

**Additional context**

See this thread on the mailing list: https://groups.google.com/d/msgid/jackson-user/20210911172814.62fd2925%40sunflower.int.arc7.info

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.