diff --git a/axzo-common/src/main/java/cn/azxo/framework/common/annotation/BaseEnumJson.java b/axzo-common/src/main/java/cn/azxo/framework/common/annotation/BaseEnumJson.java new file mode 100644 index 0000000..43e71eb --- /dev/null +++ b/axzo-common/src/main/java/cn/azxo/framework/common/annotation/BaseEnumJson.java @@ -0,0 +1,16 @@ +package cn.azxo.framework.common.annotation; + +import java.lang.annotation.*; + +/** + * @author mr.jie + * @version 1.0 + * @description + * @date 2022/8/5 17:28 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +public @interface BaseEnumJson { + +} diff --git a/axzo-common/src/main/java/cn/azxo/framework/common/ienum/BaseEnumDeserializer.java b/axzo-common/src/main/java/cn/azxo/framework/common/ienum/BaseEnumDeserializer.java new file mode 100644 index 0000000..24532fe --- /dev/null +++ b/axzo-common/src/main/java/cn/azxo/framework/common/ienum/BaseEnumDeserializer.java @@ -0,0 +1,51 @@ +package cn.azxo.framework.common.ienum; + +import java.io.IOException; +import cn.azxo.framework.common.model.BaseEnum; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import org.springframework.beans.BeanUtils; + +/** + * 枚举反序列化 + * + * @author mr.jie + * @see BaseEnumDeserializer + * @since 2021-08-05 19:13 + */ +public class BaseEnumDeserializer extends StdDeserializer { + + public BaseEnumDeserializer() { + this(null); + } + + protected BaseEnumDeserializer(Class vc) { + super(vc); + } + + @Override + public BaseEnum deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + String currentName = p.currentName(); + Object currentValue = p.getCurrentValue(); + Class findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass()); + if (BaseEnum.class.isAssignableFrom(findPropertyType) && Enum.class + .isAssignableFrom(findPropertyType)) { + Object[] enumConstants = findPropertyType.getEnumConstants(); + for (Object enumConstant : enumConstants) { + if (enumConstant instanceof BaseEnum) { + try { + if (((BaseEnum) enumConstant).getCode().toString().equals(p.getText())) { + return (BaseEnum) enumConstant; + } + } catch (NumberFormatException e) { + return null; + } + } + } + } + return null; + } +} diff --git a/axzo-common/src/main/java/cn/azxo/framework/common/ienum/BaseEnumSerializer.java b/axzo-common/src/main/java/cn/azxo/framework/common/ienum/BaseEnumSerializer.java new file mode 100644 index 0000000..3bb3742 --- /dev/null +++ b/axzo-common/src/main/java/cn/azxo/framework/common/ienum/BaseEnumSerializer.java @@ -0,0 +1,34 @@ +package cn.azxo.framework.common.ienum; + +import java.io.IOException; +import java.math.BigInteger; +import cn.azxo.framework.common.model.BaseEnum; +import cn.azxo.framework.common.utils.EnumUtils; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * 枚举序列化 + * + * @author mr.jie + * @see BaseEnumSerializer + * @since 2021-08-05 19:13 + */ +public class BaseEnumSerializer extends StdSerializer { + + public BaseEnumSerializer() { + this(null); + } + + protected BaseEnumSerializer(Class t) { + super(t); + } + + @Override + public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider provider) + throws IOException { + gen.writeObject(EnumUtils.writeObject(value)); + + } +} diff --git a/axzo-common/src/main/java/cn/azxo/framework/common/model/BaseEnum.java b/axzo-common/src/main/java/cn/azxo/framework/common/model/BaseEnum.java new file mode 100644 index 0000000..f2ff3a9 --- /dev/null +++ b/axzo-common/src/main/java/cn/azxo/framework/common/model/BaseEnum.java @@ -0,0 +1,38 @@ +package cn.azxo.framework.common.model; + +import java.util.stream.Stream; +import cn.azxo.framework.common.ienum.BaseEnumDeserializer; +import cn.azxo.framework.common.ienum.BaseEnumSerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +/** + * 枚举抽象类 + * + * @author mr.jie + * @see BaseEnum + * @since 2021-08-05 19:13 + */ +@JsonDeserialize(using = BaseEnumDeserializer.class) +@JsonSerialize(using = BaseEnumSerializer.class) +public interface BaseEnum { + + /** + * 枚举 code + * @return + */ + T getCode(); + + /** + * 枚举描述信息 + * @return + */ + String getMessage(); + + static T getByCode(Class clazz, Object code) { + return Stream.of(clazz.getEnumConstants()) + .filter(v -> v.getCode().equals(code)) + .findAny().orElse(null); + } + +} diff --git a/axzo-common/src/main/java/cn/azxo/framework/common/utils/EnumUtils.java b/axzo-common/src/main/java/cn/azxo/framework/common/utils/EnumUtils.java new file mode 100644 index 0000000..141ecec --- /dev/null +++ b/axzo-common/src/main/java/cn/azxo/framework/common/utils/EnumUtils.java @@ -0,0 +1,75 @@ +package cn.azxo.framework.common.utils; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import cn.azxo.framework.common.annotation.BaseEnumJson; +import cn.azxo.framework.common.model.BaseEnum; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +/** + * enumUtil + * + * @author mr.jie + * @version 1.0 + * @description + * @date 2022/1/26 19:59 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class EnumUtils { + + + private static final Map, Map> ENUM_MAP = new ConcurrentHashMap<>(); + private static final Map, Field> ENUM_FIELD_MAP = new ConcurrentHashMap<>(); + + /** + * enum Serializer out <----> in enum Deserializer + * + * @param findPropertyType + * @param findKey + * @return + */ + @SneakyThrows + public static BaseEnum getFieldCache(Class findPropertyType, + String findKey) { + + Map tempMap = ENUM_MAP.computeIfAbsent(findPropertyType, clazz -> new ConcurrentHashMap<>()); + BaseEnum baseEnum = tempMap.get(findKey); + if(null != baseEnum) { + return baseEnum; + } + BaseEnum[] enumConstants = findPropertyType.getEnumConstants(); + for (BaseEnum iBaseEnum : enumConstants) { + if(iBaseEnum.getCode().equals(findKey)){ + tempMap.put(findKey, iBaseEnum); + return iBaseEnum; + } + } + return null; + } + + @SneakyThrows + public static Object writeObject(T value) { + Class findPropertyType = value.getClass(); + Field field = ENUM_FIELD_MAP.get(findPropertyType); + if (field != null) { + return field.get(value); + } + Optional tempField = Arrays.stream(findPropertyType.getDeclaredFields()) + .filter(f -> f.isAnnotationPresent( + BaseEnumJson.class)).findFirst(); + if (tempField.isPresent()) { + field = tempField.get(); + if (!field.isAccessible()) { + field.setAccessible(true); + } + ENUM_FIELD_MAP.put(findPropertyType, field); + return field.get(value); + } + return value.getCode(); + } +}