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;
+ }
+}