【7.2.5】【enum】增加处理反序列化枚举的内省

pull/37/head
fengshuonan 2022-09-24 16:14:12 +08:00
parent 22b5cb9987
commit 5c021c5a29
4 changed files with 71 additions and 7 deletions

View File

@ -50,6 +50,6 @@ public @interface EnumFieldFormat {
/**
*
*/
Class<? extends ReadableEnum> processEnum();
Class<? extends ReadableEnum<?>> processEnum();
}

View File

@ -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<Object> {
/**
*
*/
private final Class<? extends ReadableEnum<?>> processEnum;
public EnumFieldFormatDeserializer(Class<? extends ReadableEnum<?>> 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;
}
}

View File

@ -27,9 +27,9 @@ public class EnumFieldFormatSerializer extends JsonSerializer<Object> {
/**
*
*/
private final Class<? extends ReadableEnum> processEnum;
private final Class<? extends ReadableEnum<?>> processEnum;
public EnumFieldFormatSerializer(FormatTypeEnum formatTypeEnum, Class<? extends ReadableEnum> processEnum) {
public EnumFieldFormatSerializer(FormatTypeEnum formatTypeEnum, Class<? extends ReadableEnum<?>> processEnum) {
this.formatTypeEnum = formatTypeEnum;
this.processEnum = processEnum;
}
@ -42,14 +42,14 @@ public class EnumFieldFormatSerializer extends JsonSerializer<Object> {
// 如果原始字段是枚举类型则直接调用接口的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();
}

View File

@ -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<? extends ReadableEnum> process = enumFieldFormat.processEnum();
Class<? extends ReadableEnum<?>> 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<? extends ReadableEnum<?>> process = enumFieldFormat.processEnum();
// 创建对应的序列化模式
return new EnumFieldFormatDeserializer(process);
}
return super.findDeserializer(annotated);
}
}