From ad79c70b68995b02ae20039d119947ddca45be79 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:12:07 -0400 Subject: [PATCH 1/3] Support Select Jackson Annotations --- jsonb-generator/pom.xml | 8 ++++ .../io/avaje/jsonb/generator/AliasPrism.java | 35 ++++++++++++++++ .../avaje/jsonb/generator/CreatorPrism.java | 35 ++++++++++++++++ .../io/avaje/jsonb/generator/IgnorePrism.java | 40 +++++++++++++++++++ .../avaje/jsonb/generator/PropertyPrism.java | 38 ++++++++++++++++++ .../avaje/jsonb/generator/package-info.java | 6 +-- .../src/main/java/module-info.java | 1 + 7 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java create mode 100644 jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java create mode 100644 jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java create mode 100644 jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java diff --git a/jsonb-generator/pom.xml b/jsonb-generator/pom.xml index 63a8a79f..1c55c0e9 100644 --- a/jsonb-generator/pom.xml +++ b/jsonb-generator/pom.xml @@ -32,6 +32,14 @@ provided + + com.fasterxml.jackson.core + jackson-annotations + 2.20 + true + provided + + io.avaje avaje-prisms diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java new file mode 100644 index 00000000..1cad4168 --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java @@ -0,0 +1,35 @@ +package io.avaje.jsonb.generator; + +import java.util.List; +import java.util.Optional; + +import javax.lang.model.element.Element; + +import com.fasterxml.jackson.annotation.JsonAlias; + +import io.avaje.jsonb.Json.Alias; +import io.avaje.prism.GeneratePrism; + +@GeneratePrism(value = Alias.class, name = "AvajeAliasPrism", superInterfaces = AliasPrism.class) +@GeneratePrism( + value = JsonAlias.class, + name = "JacksonAliasPrism", + superInterfaces = AliasPrism.class) +public interface AliasPrism { + + static boolean isPresent(Element element) { + return AvajeAliasPrism.isPresent(element) || JacksonAliasPrism.isPresent(element); + } + + static AliasPrism getInstanceOn(Element element) { + return getOptionalOn(element).orElse(null); + } + + static Optional getOptionalOn(Element element) { + return Optional.empty() + .or(() -> AvajeAliasPrism.getOptionalOn(element)) + .or(() -> JacksonAliasPrism.getOptionalOn(element)); + } + + List value(); +} diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java new file mode 100644 index 00000000..42381551 --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java @@ -0,0 +1,35 @@ +package io.avaje.jsonb.generator; + +import java.util.Optional; + +import javax.lang.model.element.Element; + +import com.fasterxml.jackson.annotation.JsonCreator; + +import io.avaje.jsonb.Json.Creator; +import io.avaje.prism.GeneratePrism; + +@GeneratePrism( + value = Creator.class, + name = "AvajeCreatorPrism", + superInterfaces = CreatorPrism.class) +@GeneratePrism( + value = JsonCreator.class, + name = "JacksonCreatorPrism", + superInterfaces = CreatorPrism.class) +public interface CreatorPrism { + + static boolean isPresent(Element element) { + return AvajeCreatorPrism.isPresent(element) || JacksonCreatorPrism.isPresent(element); + } + + static CreatorPrism getInstanceOn(Element element) { + return getOptionalOn(element).orElse(null); + } + + static Optional getOptionalOn(Element element) { + return Optional.empty() + .or(() -> AvajeCreatorPrism.getOptionalOn(element)) + .or(() -> JacksonCreatorPrism.getOptionalOn(element)); + } +} diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java new file mode 100644 index 00000000..cac8182a --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java @@ -0,0 +1,40 @@ +package io.avaje.jsonb.generator; + +import java.util.Optional; + +import javax.lang.model.element.Element; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import io.avaje.jsonb.Json.Ignore; +import io.avaje.prism.GeneratePrism; + +@GeneratePrism(value = Ignore.class, name = "AvajeIgnorePrism", superInterfaces = IgnorePrism.class) +@GeneratePrism( + value = JsonIgnore.class, + name = "JacksonIgnorePrism", + superInterfaces = IgnorePrism.class) +public interface IgnorePrism { + + static boolean isPresent(Element element) { + return AvajeIgnorePrism.isPresent(element) || JacksonIgnorePrism.isPresent(element); + } + + static IgnorePrism getInstanceOn(Element element) { + return getOptionalOn(element).orElse(null); + } + + static Optional getOptionalOn(Element element) { + return Optional.empty() + .or(() -> AvajeIgnorePrism.getOptionalOn(element)) + .or(() -> JacksonIgnorePrism.getOptionalOn(element)); + } + + default Boolean serialize() { + return false; + } + + default Boolean deserialize() { + return false; + } +} diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java new file mode 100644 index 00000000..1fadc492 --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/PropertyPrism.java @@ -0,0 +1,38 @@ +package io.avaje.jsonb.generator; + +import java.util.Optional; + +import javax.lang.model.element.Element; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.avaje.jsonb.Json.Property; +import io.avaje.prism.GeneratePrism; + +@GeneratePrism( + value = Property.class, + name = "AvajePropertyPrism", + superInterfaces = PropertyPrism.class) +@GeneratePrism( + value = JsonProperty.class, + name = "JacksonPropertyPrism", + superInterfaces = PropertyPrism.class) +public interface PropertyPrism { + + static boolean isPresent(Element element) { + + return AvajePropertyPrism.isPresent(element) || JacksonPropertyPrism.isPresent(element); + } + + static PropertyPrism getInstanceOn(Element element) { + return getOptionalOn(element).orElse(null); + } + + static Optional getOptionalOn(Element element) { + return Optional.empty() + .or(() -> AvajePropertyPrism.getOptionalOn(element)) + .or(() -> JacksonPropertyPrism.getOptionalOn(element)); + } + + String value(); +} diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java index ae70f8de..52c712cb 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/package-info.java @@ -2,17 +2,13 @@ @GeneratePrism(io.avaje.jsonb.Json.class) @GeneratePrism(io.avaje.jsonb.Json.Import.class) @GeneratePrism(io.avaje.jsonb.Json.Import.Imports.class) -@GeneratePrism(io.avaje.jsonb.Json.Alias.class) -@GeneratePrism(io.avaje.jsonb.Json.Creator.class) -@GeneratePrism(io.avaje.jsonb.Json.Ignore.class) -@GeneratePrism(io.avaje.jsonb.Json.Property.class) @GeneratePrism(io.avaje.jsonb.Json.MixIn.class) @GeneratePrism(io.avaje.jsonb.Json.Raw.class) @GeneratePrism(io.avaje.jsonb.Json.SubTypes.class) @GeneratePrism(io.avaje.jsonb.Json.SubType.class) @GeneratePrism(io.avaje.jsonb.Json.Unmapped.class) -@GeneratePrism(io.avaje.jsonb.Json.Value.class) @GeneratePrism(io.avaje.jsonb.Json.Serializer.class) +@GeneratePrism(io.avaje.jsonb.Json.Value.class) @GeneratePrism(io.avaje.jsonb.spi.MetaData.class) @GeneratePrism(io.avaje.jsonb.spi.MetaData.JsonFactory.class) package io.avaje.jsonb.generator; diff --git a/jsonb-generator/src/main/java/module-info.java b/jsonb-generator/src/main/java/module-info.java index 43545422..9f04cca6 100644 --- a/jsonb-generator/src/main/java/module-info.java +++ b/jsonb-generator/src/main/java/module-info.java @@ -1,6 +1,7 @@ module io.avaje.jsonb.generator { requires java.compiler; + requires static com.fasterxml.jackson.annotation; requires static io.avaje.json; requires static io.avaje.jsonb; requires static io.avaje.prism; From 6da5b62ff62901b3a5dae4e3a2d4d341911c9c2e Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:14:37 -0400 Subject: [PATCH 2/3] cleanup --- .../java/io/avaje/jsonb/generator/AliasPrism.java | 7 ------- .../java/io/avaje/jsonb/generator/CreatorPrism.java | 12 ------------ .../java/io/avaje/jsonb/generator/IgnorePrism.java | 4 ---- 3 files changed, 23 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java index 1cad4168..4efaa125 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java @@ -17,13 +17,6 @@ superInterfaces = AliasPrism.class) public interface AliasPrism { - static boolean isPresent(Element element) { - return AvajeAliasPrism.isPresent(element) || JacksonAliasPrism.isPresent(element); - } - - static AliasPrism getInstanceOn(Element element) { - return getOptionalOn(element).orElse(null); - } static Optional getOptionalOn(Element element) { return Optional.empty() diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java index 42381551..6e1daeef 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java @@ -1,7 +1,5 @@ package io.avaje.jsonb.generator; -import java.util.Optional; - import javax.lang.model.element.Element; import com.fasterxml.jackson.annotation.JsonCreator; @@ -22,14 +20,4 @@ public interface CreatorPrism { static boolean isPresent(Element element) { return AvajeCreatorPrism.isPresent(element) || JacksonCreatorPrism.isPresent(element); } - - static CreatorPrism getInstanceOn(Element element) { - return getOptionalOn(element).orElse(null); - } - - static Optional getOptionalOn(Element element) { - return Optional.empty() - .or(() -> AvajeCreatorPrism.getOptionalOn(element)) - .or(() -> JacksonCreatorPrism.getOptionalOn(element)); - } } diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java index cac8182a..9a3f9719 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java @@ -16,10 +16,6 @@ superInterfaces = IgnorePrism.class) public interface IgnorePrism { - static boolean isPresent(Element element) { - return AvajeIgnorePrism.isPresent(element) || JacksonIgnorePrism.isPresent(element); - } - static IgnorePrism getInstanceOn(Element element) { return getOptionalOn(element).orElse(null); } From 17e840bc1981fa89a952f1415acaabe6c3dc7343 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:21:19 -0400 Subject: [PATCH 3/3] Create JacksonExample.java --- .../models/valid/jackson/JacksonExample.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java diff --git a/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java b/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java new file mode 100644 index 00000000..e3eecdde --- /dev/null +++ b/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/jackson/JacksonExample.java @@ -0,0 +1,49 @@ +package io.avaje.jsonb.generator.models.valid.jackson; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.avaje.jsonb.Json; + +@Json.Import(JacksonExample.class) +public class JacksonExample { + + @JsonProperty("id") + private final int id; + + @JsonProperty("name") + private String name; + + @JsonIgnore private String internalCode; + + @JsonCreator + public JacksonExample( + @JsonAlias({"identifier", "userId"}) @JsonProperty("id") int id, + @JsonProperty("name") String name) { + this.id = id; + this.name = name; + this.internalCode = ""; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getInternalCode() { + return internalCode; + } + + public void setInternalCode(String internalCode) { + this.internalCode = internalCode; + } +}