diff --git a/src/main/java/ru/olegcherednik/json/jackson/JacksonSimpleModule.java b/src/main/java/ru/olegcherednik/json/jackson/JacksonSimpleModule.java new file mode 100644 index 0000000..f54b1aa --- /dev/null +++ b/src/main/java/ru/olegcherednik/json/jackson/JacksonSimpleModule.java @@ -0,0 +1,57 @@ +package ru.olegcherednik.json.jackson; + +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.module.SimpleDeserializers; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.module.SimpleSerializers; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author Oleg Cherednik + * @since 18.02.2024 + */ +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JacksonSimpleModule extends SimpleModule { + + private static final long serialVersionUID = -543871656247679655L; + + @Override + public void setupModule(SetupContext context) { + super.setupModule(context); + + addKeySerializers(context); + addKeyDeserializers(context); + + addSerializers(context); + addDeserializers(context); + } + + protected void addKeySerializers(SetupContext context) { + } + + protected void addKeyDeserializers(SetupContext context) { + } + + protected void addSerializers(SetupContext context) { + } + + protected void addDeserializers(SetupContext context) { + } + + protected static SimpleSerializers createSerializers(JsonSerializer serializer) { + SimpleSerializers serializers = new SimpleSerializers(); + serializers.addSerializer(serializer.handledType(), serializer); + return serializers; + } + + protected static SimpleDeserializers createDeserializers(JsonDeserializer deserializer) { + SimpleDeserializers deserializers = new SimpleDeserializers(); + deserializers.addDeserializer((Class) deserializer.handledType(), deserializer); + return deserializers; + } + +} diff --git a/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonDateModule.java b/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonDateModule.java index aabfd29..9fa933c 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonDateModule.java +++ b/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonDateModule.java @@ -16,12 +16,15 @@ package ru.olegcherednik.json.jackson.datetime; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.module.SimpleDeserializers; import com.fasterxml.jackson.databind.module.SimpleKeyDeserializers; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleSerializers; import com.fasterxml.jackson.databind.ser.std.DateSerializer; import lombok.RequiredArgsConstructor; +import ru.olegcherednik.json.jackson.JacksonSimpleModule; import ru.olegcherednik.json.jackson.datetime.deserializers.JacksonDateDeserializer; import java.text.DateFormat; @@ -32,37 +35,31 @@ * @since 09.12.2023 */ @RequiredArgsConstructor -public class JacksonDateModule extends SimpleModule { +public class JacksonDateModule extends JacksonSimpleModule { private static final long serialVersionUID = -7801651470699380868L; protected final DateFormat df; @Override - public void setupModule(SetupContext context) { - super.setupModule(context); - addSerializers(context); - addKeyDeserializers(context); - addDeserializers(context); + protected void addKeySerializers(SetupContext context) { + context.addKeySerializers(createSerializers(new DateSerializer(null, df))); } - private void addSerializers(SetupContext context) { - SimpleSerializers ser = new SimpleSerializers(); - ser.addSerializer(Date.class, new DateSerializer(null, df)); + // TODO check this out. Looks like it does not work now + // @Override + // protected void addKeyDeserializers(SetupContext context) { + // context.addKeyDeserializers(new SimpleKeyDeserializers()); + // } - context.addSerializers(ser); - context.addKeySerializers(ser); - } - - private static void addKeyDeserializers(SetupContext context) { - SimpleKeyDeserializers des = new SimpleKeyDeserializers(); - context.addKeyDeserializers(des); + @Override + protected void addSerializers(SetupContext context) { + context.addSerializers(createSerializers(new DateSerializer(null, df))); } - private void addDeserializers(SetupContext context) { - SimpleDeserializers des = new SimpleDeserializers(); - des.addDeserializer(Date.class, JacksonDateDeserializer.with(df)); - context.addDeserializers(des); + @Override + protected void addDeserializers(SetupContext context) { + context.addDeserializers(createDeserializers(JacksonDateDeserializer.with(df))); } } diff --git a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdModule.java b/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdModule.java index fdc246e..bdaf2ce 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdModule.java +++ b/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdModule.java @@ -16,23 +16,33 @@ package ru.olegcherednik.json.jackson.enumid; -import com.fasterxml.jackson.databind.module.SimpleModule; -import ru.olegcherednik.json.api.enumid.EnumId; +import ru.olegcherednik.json.jackson.JacksonSimpleModule; +import ru.olegcherednik.json.jackson.enumid.deserializers.EnumIdDeserializers; +import ru.olegcherednik.json.jackson.enumid.serializers.EnumIdKeySerializer; +import ru.olegcherednik.json.jackson.enumid.serializers.EnumIdSerializer; -public final class EnumIdModule extends SimpleModule { +public class EnumIdModule extends JacksonSimpleModule { private static final long serialVersionUID = -946898814418994813L; - public EnumIdModule() { - addSerializer(EnumId.class, EnumIdSerializer.INSTANCE); - addKeySerializer(EnumId.class, EnumIdKeySerializer.INSTANCE); - _deserializers = EnumIdDeserializers.INSTANCE; - } - @Override public void setupModule(SetupContext context) { super.setupModule(context); context.addBeanSerializerModifier(EnumIdSerializerModifier.INSTANCE); } + @Override + protected void addKeySerializers(SetupContext context) { + context.addKeySerializers(createSerializers(EnumIdKeySerializer.INSTANCE)); + } + + @Override + protected void addSerializers(SetupContext context) { + context.addSerializers(createSerializers(EnumIdSerializer.INSTANCE)); + } + + @Override + protected void addDeserializers(SetupContext context) { + context.addDeserializers(EnumIdDeserializers.INSTANCE); + } } diff --git a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializerModifier.java b/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializerModifier.java index 267a2c5..7f36027 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializerModifier.java +++ b/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializerModifier.java @@ -29,13 +29,13 @@ * @author Oleg Cherednik * @since 27.02.2022 */ -final class EnumIdSerializerModifier extends SerializerModifier { +public class EnumIdSerializerModifier extends SerializerModifier { private static final long serialVersionUID = -1888579980196998551L; public static final EnumIdSerializerModifier INSTANCE = new EnumIdSerializerModifier(); - private EnumIdSerializerModifier() { + protected EnumIdSerializerModifier() { super(null); } diff --git a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdDeserializers.java b/src/main/java/ru/olegcherednik/json/jackson/enumid/deserializers/EnumIdDeserializers.java similarity index 93% rename from src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdDeserializers.java rename to src/main/java/ru/olegcherednik/json/jackson/enumid/deserializers/EnumIdDeserializers.java index 7acb194..4a060c5 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdDeserializers.java +++ b/src/main/java/ru/olegcherednik/json/jackson/enumid/deserializers/EnumIdDeserializers.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ru.olegcherednik.json.jackson.enumid; +package ru.olegcherednik.json.jackson.enumid.deserializers; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.BeanDescription; @@ -36,8 +36,8 @@ * @author Oleg Cherednik * @since 27.02.2022 */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -final class EnumIdDeserializers extends SimpleDeserializers { +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class EnumIdDeserializers extends SimpleDeserializers { private static final long serialVersionUID = -6984119149643932744L; diff --git a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdKeySerializer.java b/src/main/java/ru/olegcherednik/json/jackson/enumid/serializers/EnumIdKeySerializer.java similarity index 70% rename from src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdKeySerializer.java rename to src/main/java/ru/olegcherednik/json/jackson/enumid/serializers/EnumIdKeySerializer.java index e8304b4..977fe44 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdKeySerializer.java +++ b/src/main/java/ru/olegcherednik/json/jackson/enumid/serializers/EnumIdKeySerializer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ru.olegcherednik.json.jackson.enumid; +package ru.olegcherednik.json.jackson.enumid.serializers; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; @@ -25,14 +25,19 @@ import java.io.IOException; -@NoArgsConstructor(access = AccessLevel.PRIVATE) -final class EnumIdKeySerializer extends JsonSerializer { +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class EnumIdKeySerializer extends JsonSerializer { public static final EnumIdKeySerializer INSTANCE = new EnumIdKeySerializer(); @Override - public void serialize(EnumId enumId, JsonGenerator generator, SerializerProvider serializers) throws IOException { - generator.writeFieldName(enumId.getId()); + public Class handledType() { + return EnumId.class; + } + + @Override + public void serialize(EnumId enumId, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeFieldName(enumId.getId()); } } diff --git a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializer.java b/src/main/java/ru/olegcherednik/json/jackson/enumid/serializers/EnumIdSerializer.java similarity index 86% rename from src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializer.java rename to src/main/java/ru/olegcherednik/json/jackson/enumid/serializers/EnumIdSerializer.java index 17650f4..018dd01 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/enumid/EnumIdSerializer.java +++ b/src/main/java/ru/olegcherednik/json/jackson/enumid/serializers/EnumIdSerializer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ru.olegcherednik.json.jackson.enumid; +package ru.olegcherednik.json.jackson.enumid.serializers; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; @@ -31,11 +31,16 @@ * {@link EnumId#getId()} returns lower-case enum constant name (instead of upper-case by default). Therefor you have * to define {@link ru.olegcherednik.json.api.enumid.EnumIdJsonCreator} for every {@link EnumId} instance. */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -final class EnumIdSerializer extends JsonSerializer { +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class EnumIdSerializer extends JsonSerializer { public static final EnumIdSerializer INSTANCE = new EnumIdSerializer(); + @Override + public Class handledType() { + return EnumId.class; + } + @Override public void serialize(EnumId enumId, JsonGenerator generator, SerializerProvider serializers) throws IOException { generator.writeString(enumId.getId());