mirror of https://gitee.com/stylefeng/roses
【7.2.5】【enum】增加处理反序列化枚举的内省
parent
22b5cb9987
commit
5c021c5a29
|
@ -50,6 +50,6 @@ public @interface EnumFieldFormat {
|
|||
/**
|
||||
* 具体处理值转化过程的枚举【必传】
|
||||
*/
|
||||
Class<? extends ReadableEnum> processEnum();
|
||||
Class<? extends ReadableEnum<?>> processEnum();
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue