Bladeren bron

优化枚举字典注册

zhou-hao 7 jaren geleden
bovenliggende
commit
2eb7f93d71

+ 7 - 2
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/EnumDictHandlerRegister.java

@@ -9,6 +9,7 @@ import org.apache.ibatis.type.MappedJdbcTypes;
 import org.apache.ibatis.type.TypeHandler;
 import org.apache.ibatis.type.TypeHandlerRegistry;
 import org.hswebframework.web.dict.EnumDict;
+import org.hswebframework.web.dict.defaults.DefaultDictDefineRepository;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@@ -19,7 +20,10 @@ import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.util.ClassUtils;
 
 import java.io.IOException;
-import java.sql.*;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 import static org.springframework.util.StringUtils.tokenizeToStringArray;
 
@@ -53,7 +57,8 @@ public class EnumDictHandlerRegister {
                         MetadataReader reader = metadataReaderFactory.getMetadataReader(resource);
                         Class enumType = Class.forName(reader.getClassMetadata().getClassName());
                         if (enumType.isEnum() && EnumDict.class.isAssignableFrom(enumType)) {
-                            log.debug("register typeHandler for enum dict:{}", enumType);
+                            log.debug("register enum dict:{}", enumType);
+                            DefaultDictDefineRepository.registerDefine(DefaultDictDefineRepository.parseEnumDict(enumType));
                             typeHandlerRegistry.register(enumType, new EnumDictHandler(enumType));
                         }
                     } catch (Exception ignore) {

+ 5 - 0
hsweb-core/pom.xml

@@ -34,5 +34,10 @@
             <groupId>commons-beanutils</groupId>
             <artifactId>commons-beanutils</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 0
hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefineRepository.java

@@ -10,4 +10,6 @@ public interface DictDefineRepository {
     DictDefine getDefine(String id);
 
     List<ClassDictDefine> getDefine(Class type);
+
+    void addDefine(DictDefine dictDefine);
 }

+ 10 - 28
hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java

@@ -19,38 +19,15 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 public class DefaultDictDefineRepository implements DictDefineRepository {
-    protected Map<String, DictDefine> parsedDict = new HashMap<>();
+    protected static final Map<String, DictDefine> parsedDict = new HashMap<>();
 
-    public void registerDefine(DictDefine define) {
+    public static void registerDefine(DictDefine define) {
         parsedDict.put(define.getId(), define);
     }
 
-    static {
-        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
-        SimpleMetadataReaderFactory readerFactory = new SimpleMetadataReaderFactory();
-
-        try {
-            Resource[] resources = resourcePatternResolver.getResources("classpath*:org/hswebframework/web/**/*.class");
-            for (Resource resource : resources) {
-                try {
-                    MetadataReader reader = readerFactory.getMetadataReader(resource);
-                    String className = reader.getClassMetadata().getClassName();
-                    Class type = Class.forName(className);
-                    if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) {
-
-                    }
-                } catch (Error e) {
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    protected <T extends Enum & EnumDict> List<DictDefine> parseEnumDict(Class<T> type) {
+    public static <T extends Enum & EnumDict> ClassDictDefine parseEnumDict(Class<T> type) {
         log.debug("parse enum dict :{}", type);
 
-
         Dict dict = type.getAnnotation(Dict.class);
 
         DefaultClassDictDefine define = new DefaultClassDictDefine();
@@ -78,7 +55,7 @@ public class DefaultDictDefineRepository implements DictDefineRepository {
         }
         define.setItems(items);
 
-        return new ArrayList<>(Collections.singletonList(define));
+        return define;
 
     }
 
@@ -105,7 +82,7 @@ public class DefaultDictDefineRepository implements DictDefineRepository {
         List<ClassDictDefine> defines = new ArrayList<>();
 
         if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) {
-            return parseEnumDict(type);
+            return Arrays.asList(parseEnumDict(type));
         }
         for (Field field : parseField(type)) {
             Dict dict = field.getAnnotation(Dict.class);
@@ -156,4 +133,9 @@ public class DefaultDictDefineRepository implements DictDefineRepository {
         }
         return defines;
     }
+
+    @Override
+    public void addDefine(DictDefine dictDefine) {
+        registerDefine(dictDefine);
+    }
 }

+ 9 - 1
hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java

@@ -1,11 +1,19 @@
 package org.hswebframework.web.dict;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.parser.DefaultJSONParser;
+import com.alibaba.fastjson.parser.ParserConfig;
+import com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer;
+import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import org.hswebframework.web.dict.defaults.DefaultClassDictDefine;
 import org.hswebframework.web.dict.defaults.DefaultDictDefineRepository;
 import org.hswebframework.web.dict.defaults.DefaultDictSupportApi;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.List;
 
@@ -21,9 +29,9 @@ public class DictDefineTest {
 
     private DictSupportApi api = new DefaultDictSupportApi(repository);
 
-
     @Test
     public void testEnumDict() {
+
         Assert.assertEquals(UserCode.SIMPLE, EnumDict.findByValue(UserCode.class, UserCode.SIMPLE.getValue()).orElse(null));
 
         Assert.assertEquals(UserCode.SIMPLE, EnumDict.findByText(UserCode.class, UserCode.SIMPLE.getText()).orElse(null));

+ 2 - 0
hsweb-core/src/test/java/org/hswebframework/web/dict/UseDictEntity2.java

@@ -18,4 +18,6 @@ public class UseDictEntity2 extends UseDictEntity {
                     @Item(text = "编码2", value = "2")
             })
     private String code;
+
+    private UserCode userCode=UserCode.SIMPLE;
 }

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

@@ -1,5 +1,6 @@
 package org.hswebframework.web.dict;
 
+import com.alibaba.fastjson.annotation.JSONType;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 

+ 3 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/HswebAutoConfiguration.java

@@ -28,6 +28,7 @@ import org.hswebframework.web.ThreadLocalUtils;
 import org.hswebframework.web.commons.entity.factory.EntityFactory;
 import org.hswebframework.web.commons.entity.factory.MapperEntityFactory;
 import org.hswebframework.web.convert.CustomMessageConverter;
+import org.hswebframework.web.dict.EnumDict;
 import org.hswebframework.web.starter.convert.FastJsonGenericHttpMessageConverter;
 import org.hswebframework.web.starter.convert.FastJsonHttpMessageConverter;
 import org.hswebframework.web.starter.entity.EntityFactoryInitConfiguration;
@@ -115,6 +116,7 @@ public class HswebAutoConfiguration {
                 if (type instanceof Class) {
                     Class classType = ((Class) type);
                     if (classType.isEnum()) {
+                        // TODO: 2018/4/12 支持EnumDict枚举的反序列化
                         return super.getDeserializer(type);
                     }
                     checkAutoType(type.getTypeName(), ((Class) type));
@@ -200,7 +202,7 @@ public class HswebAutoConfiguration {
     }
 
     @Bean
-    public RestControllerExceptionTranslator restControllerExceptionTranslator(){
+    public RestControllerExceptionTranslator restControllerExceptionTranslator() {
         return new RestControllerExceptionTranslator();
     }