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.formatTypeEnum = formatTypeEnum;
|
||||||
this.processEnum = processEnum;
|
this.processEnum = processEnum;
|
||||||
}
|
}
|
||||||
|
@ -42,14 +42,14 @@ public class EnumFieldFormatSerializer extends JsonSerializer<Object> {
|
||||||
|
|
||||||
// 如果原始字段是枚举类型,则直接调用接口的getName()方法完成转化
|
// 如果原始字段是枚举类型,则直接调用接口的getName()方法完成转化
|
||||||
if (originValue instanceof ReadableEnum) {
|
if (originValue instanceof ReadableEnum) {
|
||||||
formattedValue = ((ReadableEnum) originValue).getName();
|
formattedValue = ((ReadableEnum<?>) originValue).getName();
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// 如果是其他类型,则获取枚举的getKey()的类型是什么
|
// 如果是其他类型,则获取枚举的getKey()的类型是什么
|
||||||
// getKey()类型和值类型一致才能进行转化
|
// getKey()类型和值类型一致才能进行转化
|
||||||
if (processEnum.isEnum()) {
|
if (processEnum.isEnum()) {
|
||||||
ReadableEnum[] enumConstants = processEnum.getEnumConstants();
|
ReadableEnum<?>[] enumConstants = processEnum.getEnumConstants();
|
||||||
for (ReadableEnum enumConstant : enumConstants) {
|
for (ReadableEnum<?> enumConstant : enumConstants) {
|
||||||
if (enumConstant.getKey().equals(originValue)) {
|
if (enumConstant.getKey().equals(originValue)) {
|
||||||
formattedValue = enumConstant.getName();
|
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.ReadableEnum;
|
||||||
import cn.stylefeng.roses.kernel.rule.base.SimpleFieldFormatProcess;
|
import cn.stylefeng.roses.kernel.rule.base.SimpleFieldFormatProcess;
|
||||||
import cn.stylefeng.roses.kernel.rule.enums.FormatTypeEnum;
|
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.enums.EnumFieldFormatSerializer;
|
||||||
import cn.stylefeng.roses.kernel.wrapper.field.simple.SimpleFieldFormatSerializer;
|
import cn.stylefeng.roses.kernel.wrapper.field.simple.SimpleFieldFormatSerializer;
|
||||||
import com.fasterxml.jackson.databind.introspect.Annotated;
|
import com.fasterxml.jackson.databind.introspect.Annotated;
|
||||||
|
@ -46,7 +47,7 @@ public class CustomJacksonIntrospector extends JacksonAnnotationIntrospector {
|
||||||
FormatTypeEnum formatTypeEnum = enumFieldFormat.formatType();
|
FormatTypeEnum formatTypeEnum = enumFieldFormat.formatType();
|
||||||
|
|
||||||
// 获取具体的处理枚举
|
// 获取具体的处理枚举
|
||||||
Class<? extends ReadableEnum> process = enumFieldFormat.processEnum();
|
Class<? extends ReadableEnum<?>> process = enumFieldFormat.processEnum();
|
||||||
|
|
||||||
// 创建对应的序列化模式
|
// 创建对应的序列化模式
|
||||||
return new EnumFieldFormatSerializer(formatTypeEnum, process);
|
return new EnumFieldFormatSerializer(formatTypeEnum, process);
|
||||||
|
@ -55,4 +56,21 @@ public class CustomJacksonIntrospector extends JacksonAnnotationIntrospector {
|
||||||
return super.findSerializer(annotated);
|
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