Bladeren bron

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomCodecsAutoConfiguration.java
zhou-hao 3 jaren geleden
bovenliggende
commit
fafb29033e

+ 14 - 6
hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java

@@ -16,6 +16,8 @@ import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.hswebframework.web.exception.ValidationException;
@@ -25,6 +27,7 @@ import org.springframework.util.StringUtils;
 import java.io.IOException;
 import java.lang.reflect.Type;
 import java.util.*;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -123,11 +126,6 @@ public interface EnumDict<V> extends JSONSerializable {
         return getText();
     }
 
-    @JsonCreator
-    default EnumDict<V> fromJsonNode(Object val) {
-
-        return null;
-    }
 
 
     /**
@@ -294,7 +292,10 @@ public interface EnumDict<V> extends JSONSerializable {
      * 自定义fastJson枚举序列化
      */
     @Slf4j
+    @AllArgsConstructor
+    @NoArgsConstructor
     class EnumDictJSONDeserializer extends JsonDeserializer implements ObjectDeserializer {
+        private Function<Object,Object> mapper;
 
         @Override
         @SuppressWarnings("all")
@@ -346,7 +347,14 @@ public interface EnumDict<V> extends JSONSerializable {
         @SneakyThrows
         public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
             JsonNode node = jp.getCodec().readTree(jp);
-
+            if(mapper!=null){
+                if(node.isTextual()){
+                    return mapper.apply(node.asText());
+                }
+                if(node.isNumber()){
+                    return mapper.apply(node.asLong());
+                }
+            }
             String currentName = jp.currentName();
             Object currentValue = jp.getCurrentValue();
             Class findPropertyType;

+ 32 - 4
hsweb-core/src/test/java/org/hswebframework/web/dict/EnumDictTest.java

@@ -1,14 +1,19 @@
 package org.hswebframework.web.dict;
 
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.deser.std.EnumDeserializer;
+import com.fasterxml.jackson.databind.module.SimpleDeserializers;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.type.ClassKey;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.SneakyThrows;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.List;
+
 import static org.junit.Assert.*;
 
 public class EnumDictTest {
@@ -18,8 +23,22 @@ public class EnumDictTest {
     public void testJackson() {
         ObjectMapper mapper = new ObjectMapper();
         SimpleModule module = new SimpleModule();
-        JsonDeserializer<EnumDict> deserialize = new EnumDict.EnumDictJSONDeserializer();
-        module.addDeserializer(Enum.class, (JsonDeserializer) deserialize);
+        module.setDeserializers(new SimpleDeserializers() {
+            @Override
+            public JsonDeserializer<?> findEnumDeserializer(Class<?> type,
+                                                            DeserializationConfig config,
+                                                            BeanDescription beanDesc) throws JsonMappingException {
+                JsonDeserializer<?> deser = null;
+                if (type.isEnum()) {
+                    if (EnumDict.class.isAssignableFrom(type)) {
+                        deser = new EnumDict.EnumDictJSONDeserializer(val -> EnumDict
+                                .find((Class) type, val)
+                                .orElse(null));
+                    }
+                }
+                return deser;
+            }
+        });
         mapper.registerModule(module);
 
 
@@ -40,6 +59,11 @@ public class EnumDictTest {
 
         System.out.println((Object) mapper.readerFor(TestEnum.class).readValue("\"E1\""));
 
+        testEntity = mapper.readerFor(TestEntity.class)
+                           .readValue("{\"testEnums\":[\"E1\"]}");
+//        System.out.println(testEntity.getTestEnums());
+        Assert.assertArrayEquals(testEntity.getTestEnums(), new TestEnum[]{TestEnum.E1});
+
     }
 
     @Test
@@ -49,9 +73,11 @@ public class EnumDictTest {
 
         assertTrue(EnumDict.find(TestEnum.class, "e1")
                            .isPresent());
+
         assertTrue(EnumDict.find(TestEnum.class, "E1")
                            .isPresent());
 
+
     }
 
     @Getter
@@ -60,6 +86,8 @@ public class EnumDictTest {
         private TestEnum testEnum = TestEnum.E1;
 
         private SimpleEnum simpleEnum = SimpleEnum.A;
+
+        private TestEnum[] testEnums;
     }
 
     public enum SimpleEnum {

+ 0 - 1
hsweb-core/src/test/java/org/hswebframework/web/dict/TestEnum.java

@@ -1,7 +1,6 @@
 package org.hswebframework.web.dict;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 

+ 27 - 12
hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomCodecsAutoConfiguration.java

@@ -1,8 +1,10 @@
 package org.hswebframework.web.starter.jackson;
 
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.deser.std.EnumDeserializer;
+import com.fasterxml.jackson.databind.module.SimpleDeserializers;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.type.ClassKey;
 import org.hswebframework.web.api.crud.entity.EntityFactory;
 import org.hswebframework.web.dict.EnumDict;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -23,16 +25,29 @@ public class CustomCodecsAutoConfiguration {
 	@ConditionalOnClass(ObjectMapper.class)
 	static class JacksonDecoderConfiguration {
 
-		@Bean
-		@Order(1)
-		@ConditionalOnBean(ObjectMapper.class)
-		CodecCustomizer jacksonDecoderCustomizer(EntityFactory entityFactory, ObjectMapper objectMapper) {
-		//	objectMapper.setTypeFactory(new CustomTypeFactory(entityFactory));
-			SimpleModule module = new SimpleModule();
-			@SuppressWarnings("all")
-			JsonDeserializer<Enum<?>> deserializer = new EnumDict.EnumDictJSONDeserializer();
-			module.addDeserializer(Enum.class,  deserializer);
-			objectMapper.registerModule(module);
+        @Bean
+        @Order(1)
+        @ConditionalOnBean(ObjectMapper.class)
+        CodecCustomizer jacksonDecoderCustomizer(EntityFactory entityFactory, ObjectMapper objectMapper) {
+            //	objectMapper.setTypeFactory(new CustomTypeFactory(entityFactory));
+            SimpleModule module = new SimpleModule();
+            module.setDeserializers(new SimpleDeserializers() {
+                @Override
+                public JsonDeserializer<?> findEnumDeserializer(Class<?> type,
+                                                                DeserializationConfig config,
+                                                                BeanDescription beanDesc) {
+                    JsonDeserializer<?> deser = null;
+                    if (type.isEnum()) {
+                        if (EnumDict.class.isAssignableFrom(type)) {
+                            deser = new EnumDict.EnumDictJSONDeserializer(val -> EnumDict
+                                    .find((Class) type, val)
+                                    .orElse(null));
+                        }
+                    }
+                    return deser;
+                }
+            });
+            objectMapper.registerModule(module);
 
 
 			return (configurer) -> {