Eric пре 1 година
родитељ
комит
7e4e8ba479

+ 69 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/config/JacksonConfig.java

@@ -1,10 +1,15 @@
 package com.yonge.cooleshow.config;
 
 import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
@@ -13,12 +18,17 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+import com.yonge.cooleshow.common.config.EnumConverterFactory;
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
 import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.util.StringUtils;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -105,6 +115,10 @@ public class JacksonConfig {
                     .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(NORM_DATE_PATTERN)))
                     .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(NORM_TIME_PATTERN)))
 
+                     // 枚举类序列化
+                    .addDeserializer(Enum.class, new BaseEnumDeserializer())
+                    .addSerializer(BaseEnum.class, new BaseEnumSerializer())
+
                     // Long对象转String
                     //.addSerializer(Float.class, new FloatJsonSerializer())
                     //.addSerializer(Float.TYPE, new FloatJsonSerializer())
@@ -184,4 +198,59 @@ public class JacksonConfig {
             }
         }
     }
+
+    /**
+     * 枚举类反序列化
+     */
+    @Data
+    @EqualsAndHashCode(callSuper = true)
+    public static class BaseEnumDeserializer extends JsonDeserializer<Enum<?>> implements ContextualDeserializer {
+
+        private Class<?> target;
+
+        @SuppressWarnings("all")
+        @Override
+        public Enum<?> deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
+            if (!StringUtils.hasText(jsonParser.getText())) {
+                return null;
+            }
+
+            if (BaseEnum.class.isAssignableFrom(target)) {
+                return (Enum<?>) EnumConverterFactory.getEnum((Class) target, jsonParser.getText());
+            }
+            return null;
+        }
+
+        /**
+         * @param ctx      DeserializationContext
+         * @param property BeanProperty
+         * @return JsonDeserializer
+         */
+        @Override
+        public JsonDeserializer<?> createContextual(DeserializationContext ctx, BeanProperty property) {
+            Class<?> rawCls = ctx.getContextualType().getRawClass();
+            BaseEnumDeserializer enumDeserializer = new BaseEnumDeserializer();
+            enumDeserializer.setTarget(rawCls);
+            return enumDeserializer;
+        }
+
+    }
+
+    /**
+     * 枚举类序列化
+     */
+    public static class BaseEnumSerializer extends JsonSerializer<BaseEnum> {
+
+        @Override
+        public void serialize(BaseEnum enums, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+
+            if (enums.getCode() instanceof Integer) {
+                // 返回整形
+                jsonGenerator.writeNumber(Integer.parseInt(String.valueOf(enums.getCode())));
+            } else {
+                // 返回字符串
+                jsonGenerator.writeString(String.valueOf(enums.getCode()));
+            }
+        }
+    }
 }

+ 24 - 6
cooleshow-common/src/main/java/com/yonge/cooleshow/common/config/EnumConverterFactory.java

@@ -1,20 +1,22 @@
 package com.yonge.cooleshow.common.config;
 
+import com.beust.jcommander.internal.Maps;
 import com.yonge.toolset.base.enums.BaseEnum;
 import org.springframework.core.convert.converter.Converter;
 import org.springframework.core.convert.converter.ConverterFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Map;
+
 @Component
 public class EnumConverterFactory implements ConverterFactory<Object, BaseEnum<?, ?>> {
 
-	//@SuppressWarnings("rawtypes")
-	//private static final Map<Class, Converter> CONVERTERS = Maps.newHashMap();
+	private static final Map<Class<?>, Converter> CONVERTERS = Maps.newHashMap();
 
 	@Override
 	public <T extends BaseEnum<?, ?>> Converter<Object, T> getConverter(Class<T> targetType) {
 
-		return source ->  {
+		/*return source ->  {
 			T ret = null;
 
 			for (T t : targetType.getEnumConstants()) {
@@ -25,14 +27,30 @@ public class EnumConverterFactory implements ConverterFactory<Object, BaseEnum<?
 				}
 			}
 			return ret;
-		};
+		};*/
 
-		/*Converter<Object, T> converter = CONVERTERS.get(targetType);
+		Converter<Object, T> converter = CONVERTERS.get(targetType);
 		if (converter == null) {
 			converter = new EnumConverter<>(targetType);
 			CONVERTERS.put(targetType, converter);
 		}
-		return converter;*/
+		return converter;
+	}
+
+	/**
+	 * 根据code获取枚举
+	 * @param targetType 枚举类型
+	 * @param source code
+	 * @return 枚举
+	 * @param <T> 枚举类型
+	 */
+	public static <T extends BaseEnum<?, ?>> T getEnum(Class<T> targetType, String source) {
+		for (T constant : targetType.getEnumConstants()) {
+			if (source.equals(String.valueOf(constant.getCode()))) {
+				return constant;
+			}
+		}
+		return null;
 	}
 
 }

+ 2 - 2
toolset/toolset-base/src/main/java/com/yonge/toolset/base/enums/BaseEnum.java

@@ -7,8 +7,8 @@ public interface BaseEnum<T, E extends Enum<E>> {
 
 	/**
 	 * 获取枚举类的code值
-	 * @return
+	 * @return T
 	 */
-	public T getCode();
+	T getCode();
 
 }