diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/annotation/EnumFieldFormat.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/annotation/EnumFieldFormat.java index ee1b172a6..344d7615f 100644 --- a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/annotation/EnumFieldFormat.java +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/annotation/EnumFieldFormat.java @@ -50,6 +50,6 @@ public @interface EnumFieldFormat { /** * 具体处理值转化过程的枚举【必传】 */ - Class processEnum(); + Class> processEnum(); } diff --git a/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatDeserializer.java b/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatDeserializer.java new file mode 100644 index 000000000..0393da101 --- /dev/null +++ b/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatDeserializer.java @@ -0,0 +1,46 @@ +package cn.stylefeng.roses.kernel.wrapper.field.enums; + +import cn.stylefeng.roses.kernel.rule.base.ReadableEnum; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +/** + * 针对@EnumFieldFormat注解的具体反序列化过程 + * + * @author fengshuonan + * @date 2022/9/24 15:04 + */ +@Slf4j +public class EnumFieldFormatDeserializer extends JsonDeserializer { + + /** + * 具体反序列化需要的枚举 + */ + private final Class> processEnum; + + public EnumFieldFormatDeserializer(Class> processEnum) { + this.processEnum = processEnum; + } + + @Override + public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + + // 获取当前对象原始值 + String originRequestValue = jsonParser.getValueAsString(); + + // 判断是否是枚举类型 + if (processEnum.isEnum()) { + ReadableEnum[] enumConstants = processEnum.getEnumConstants(); + for (ReadableEnum enumConstant : enumConstants) { + return enumConstant.parseToEnum(originRequestValue); + } + } + + return null; + } + +} diff --git a/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatSerializer.java b/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatSerializer.java index ec4c4b747..5d41e9ac8 100644 --- a/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatSerializer.java +++ b/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/enums/EnumFieldFormatSerializer.java @@ -27,9 +27,9 @@ public class EnumFieldFormatSerializer extends JsonSerializer { /** * 具体序列化需要的枚举 */ - private final Class processEnum; + private final Class> processEnum; - public EnumFieldFormatSerializer(FormatTypeEnum formatTypeEnum, Class processEnum) { + public EnumFieldFormatSerializer(FormatTypeEnum formatTypeEnum, Class> processEnum) { this.formatTypeEnum = formatTypeEnum; this.processEnum = processEnum; } @@ -42,14 +42,14 @@ public class EnumFieldFormatSerializer extends JsonSerializer { // 如果原始字段是枚举类型,则直接调用接口的getName()方法完成转化 if (originValue instanceof ReadableEnum) { - formattedValue = ((ReadableEnum) originValue).getName(); + formattedValue = ((ReadableEnum) originValue).getName(); } else { // 如果是其他类型,则获取枚举的getKey()的类型是什么 // getKey()类型和值类型一致才能进行转化 if (processEnum.isEnum()) { - ReadableEnum[] enumConstants = processEnum.getEnumConstants(); - for (ReadableEnum enumConstant : enumConstants) { + ReadableEnum[] enumConstants = processEnum.getEnumConstants(); + for (ReadableEnum enumConstant : enumConstants) { if (enumConstant.getKey().equals(originValue)) { formattedValue = enumConstant.getName(); } diff --git a/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/jackson/CustomJacksonIntrospector.java b/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/jackson/CustomJacksonIntrospector.java index 0bc6a1a7d..bb8c74696 100644 --- a/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/jackson/CustomJacksonIntrospector.java +++ b/kernel-d-wrapper/wrapper-field-sdk/src/main/java/cn/stylefeng/roses/kernel/wrapper/field/jackson/CustomJacksonIntrospector.java @@ -5,6 +5,7 @@ import cn.stylefeng.roses.kernel.rule.annotation.SimpleFieldFormat; import cn.stylefeng.roses.kernel.rule.base.ReadableEnum; import cn.stylefeng.roses.kernel.rule.base.SimpleFieldFormatProcess; import cn.stylefeng.roses.kernel.rule.enums.FormatTypeEnum; +import cn.stylefeng.roses.kernel.wrapper.field.enums.EnumFieldFormatDeserializer; import cn.stylefeng.roses.kernel.wrapper.field.enums.EnumFieldFormatSerializer; import cn.stylefeng.roses.kernel.wrapper.field.simple.SimpleFieldFormatSerializer; import com.fasterxml.jackson.databind.introspect.Annotated; @@ -46,7 +47,7 @@ public class CustomJacksonIntrospector extends JacksonAnnotationIntrospector { FormatTypeEnum formatTypeEnum = enumFieldFormat.formatType(); // 获取具体的处理枚举 - Class process = enumFieldFormat.processEnum(); + Class> process = enumFieldFormat.processEnum(); // 创建对应的序列化模式 return new EnumFieldFormatSerializer(formatTypeEnum, process); @@ -55,4 +56,21 @@ public class CustomJacksonIntrospector extends JacksonAnnotationIntrospector { return super.findSerializer(annotated); } + @Override + public Object findDeserializer(Annotated annotated) { + + // 枚举的反序列化 + EnumFieldFormat enumFieldFormat = annotated.getAnnotation(EnumFieldFormat.class); + + if (enumFieldFormat != null && enumFieldFormat.processEnum() != null) { + + // 获取具体的处理枚举 + Class> process = enumFieldFormat.processEnum(); + + // 创建对应的序列化模式 + return new EnumFieldFormatDeserializer(process); + } + + return super.findDeserializer(annotated); + } }