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..4efaa125 --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/AliasPrism.java @@ -0,0 +1,28 @@ +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 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..6e1daeef --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/CreatorPrism.java @@ -0,0 +1,23 @@ +package io.avaje.jsonb.generator; + +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); + } +} 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..9a3f9719 --- /dev/null +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/IgnorePrism.java @@ -0,0 +1,36 @@ +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 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; 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; + } +}