zhou-hao %!s(int64=7) %!d(string=hai) anos
pai
achega
0d1cadcc42

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

@@ -89,7 +89,7 @@ public class EnumDictHandlerRegister {
         @Override
         public void setParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
             T[] ts = ((T[]) parameter);
-            ps.setLong(i, EnumDict.toBit(ts));
+            ps.setLong(i, EnumDict.toMask(ts));
         }
 
         @Override
@@ -111,7 +111,7 @@ public class EnumDictHandlerRegister {
             if (null == value) {
                 return null;
             }
-            List<T> ts = EnumDict.getByBit(getType(), value);
+            List<T> ts = EnumDict.getByMask(getType(), value);
             return ts.toArray((Object[]) Array.newInstance(type, ts.size()));
         }
     }

+ 1 - 3
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/EnumDicInTermTypeMapper.java

@@ -3,14 +3,12 @@ package org.hswebframework.web.dao.mybatis.mapper;
 import lombok.AllArgsConstructor;
 import org.hswebframework.ezorm.core.param.Term;
 import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
-import org.hswebframework.ezorm.rdb.render.Sql;
 import org.hswebframework.ezorm.rdb.render.SqlAppender;
 import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
 import org.hswebframework.ezorm.rdb.render.dialect.Dialect.TermTypeMapper;
 import org.hswebframework.web.dict.EnumDict;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 @AllArgsConstructor
 @SuppressWarnings("all")
@@ -45,7 +43,7 @@ public abstract class EnumDicInTermTypeMapper implements TermTypeMapper {
                             .stream().map(v -> EnumDict.find(componentType, v).orElse(null))
                             .filter(Objects::nonNull)
                             .toArray(EnumDict[]::new);
-                    long bit = EnumDict.toBit(newValue);
+                    long bit = EnumDict.toMask(newValue);
                     term.setValue(bit);
                 }else{
                     //枚举数量大于等于64,无法使用位运算

+ 1 - 1
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/EnumDicTermTypeMapper.java

@@ -41,7 +41,7 @@ public class EnumDicTermTypeMapper implements TermTypeMapper {
                         .stream().map(v -> EnumDict.find(componentType, v).orElse(null))
                         .filter(Objects::nonNull)
                         .toArray(EnumDict[]::new);
-                long bit = EnumDict.toBit(newValue);
+                long bit = EnumDict.toMask(newValue);
                 term.setValue(bit);
             }
         } else {

+ 41 - 17
hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java

@@ -2,6 +2,7 @@ package org.hswebframework.web.dict;
 
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
 import com.alibaba.fastjson.parser.DefaultJSONParser;
 import com.alibaba.fastjson.parser.JSONLexer;
 import com.alibaba.fastjson.parser.JSONToken;
@@ -20,11 +21,16 @@ import java.util.function.Predicate;
 /**
  * 枚举字典,使用枚举来实现数据字典,可通过集成此接口来实现一些有趣的功能.
  * ⚠️:如果使用了位运算来判断枚举,枚举数量不要超过64个,且顺序不要随意变动!
- * 如果枚举数量大于64,你应该使用{@link org.hswebframework.web.dict.apply.DictApply}来处理
+ * 如果枚举数量大于64,你应该使用{@link org.hswebframework.web.dict.apply.DictApply}来处理.
+ * ⚠️:如果要开启在反序列化json的时候,支持将对象反序列化枚举,由于fastJson目前的版本还不支持从父类获取注解,
+ * 所以需要在实现类上注解:<code>@JSONType(deserializer = EnumDict.EnumDictJSONDeserializer.class)</code>.
  *
  * @author zhouhao
  * @see 3.0
+ * @see EnumDictJSONDeserializer
+ * @see JSONSerializable
  */
+@JSONType(deserializer = EnumDict.EnumDictJSONDeserializer.class)
 public interface EnumDict<V> extends JSONSerializable {
 
     /**
@@ -54,7 +60,7 @@ public interface EnumDict<V> extends JSONSerializable {
         return ordinal();
     }
 
-    default long getBit() {
+    default long getMask() {
         return 1L << index();
     }
 
@@ -68,13 +74,13 @@ public interface EnumDict<V> extends JSONSerializable {
         return this == v
                 || getValue() == v
                 || getValue().equals(v)
-                || v.equals(getBit())
+                || v.equals(getMask())
                 || String.valueOf(getValue()).equalsIgnoreCase(String.valueOf(v))
                 || getText().equalsIgnoreCase(String.valueOf(v));
     }
 
     default boolean in(long bit) {
-        return (bit & getBit()) != 0;
+        return (bit & getMask()) != 0;
     }
 
     /**
@@ -133,30 +139,30 @@ public interface EnumDict<V> extends JSONSerializable {
     }
 
     @SafeVarargs
-    static <T extends EnumDict> long toBit(T... t) {
+    static <T extends EnumDict> long toMask(T... t) {
         if (t == null) {
             return 0L;
         }
         long value = 0L;
         for (T t1 : t) {
-            value |= t1.getBit();
+            value |= t1.getMask();
         }
         return value;
     }
 
     @SafeVarargs
-    static <T extends EnumDict> boolean bitIn(long bit, T... t) {
-        long value = toBit(t);
+    static <T extends EnumDict> boolean maskIn(long bit, T... t) {
+        long value = toMask(t);
         return (bit & value) == value;
     }
 
     @SafeVarargs
-    static <T extends EnumDict> boolean bitInAny(long bit, T... t) {
-        long value = toBit(t);
+    static <T extends EnumDict> boolean maskInAny(long bit, T... t) {
+        long value = toMask(t);
         return (bit & value) != 0;
     }
 
-    static <T extends EnumDict> List<T> getByBit(Class<T> tClass, long bit) {
+    static <T extends EnumDict> List<T> getByMask(Class<T> tClass, long bit) {
         List<T> arr = new ArrayList<>();
         for (T t : tClass.getEnumConstants()) {
             if (t.in(bit)) {
@@ -166,29 +172,47 @@ public interface EnumDict<V> extends JSONSerializable {
         return arr;
     }
 
-    boolean DEFAULT_WRITE_JSON_OBJECT = Boolean.getBoolean("hsweb.enum.dict.enableWriteJSONObject");
+    /**
+     * 默认在序列化为json时,默认会以对象方式写出枚举,可通过系统环境变量 <code>hsweb.enum.dict.disableWriteJSONObject</code>关闭默认设置。
+     * 比如: java -jar -Dhsweb.enum.dict.disableWriteJSONObject=true
+     */
+    boolean DEFAULT_WRITE_JSON_OBJECT = !Boolean.getBoolean("hsweb.enum.dict.disableWriteJSONObject");
 
-    default boolean writeJSONObject() {
+    /**
+     * @return 是否在序列化为json的时候, 将枚举以对象方式序列化
+     * @see this#DEFAULT_WRITE_JSON_OBJECT
+     */
+    default boolean isWriteJSONObjectEnabled() {
         return DEFAULT_WRITE_JSON_OBJECT;
     }
 
-    default JSONObject getWriteObject() {
+    /**
+     * 当{@link this#isWriteJSONObjectEnabled()}返回true时,在序列化为json的时候,会写出此方法返回的对象
+     *
+     * @return 最终序列化的值
+     * @see this#isWriteJSONObjectEnabled()
+     */
+    default Object getWriteJSONObject() {
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("value", getValue());
         jsonObject.put("text", getText());
+        jsonObject.put("index", index());
+        jsonObject.put("mask", getMask());
         return jsonObject;
     }
 
     @Override
     default void write(JSONSerializer jsonSerializer, Object o, Type type, int i) throws IOException {
-        if (writeJSONObject()) {
-            jsonSerializer.write(getWriteObject());
+        if (isWriteJSONObjectEnabled()) {
+            jsonSerializer.write(getWriteJSONObject());
         } else {
             jsonSerializer.write(getValue());
         }
-
     }
 
+    /**
+     * 自定义fastJson枚举序列化
+     */
     class EnumDictJSONDeserializer implements ObjectDeserializer {
 
         @Override

+ 8 - 6
hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java

@@ -29,8 +29,10 @@ public class DictDefineTest {
         UserCode code=UserCode.CODE0;
 
         String json  =JSON.toJSONString(code);
+        System.out.println(json);
         Assert.assertNotNull(json);
         Assert.assertNotNull(JSON.parseObject(json,UserCode.class));
+
     }
     @Test
     public void testEnumDict() {
@@ -41,20 +43,20 @@ public class DictDefineTest {
 
         Assert.assertEquals(UserCode.SIMPLE, find(UserCode.class, UserCode.SIMPLE.getText()).orElse(null));
 
-        long bit = toBit( UserCode.values());
+        long bit = toMask( UserCode.values());
 
-        System.out.println(bitIn(bit,UserCode.SIMPLE,UserCode.TEST,UserCode.SIMPLE));
+        System.out.println(maskIn(bit,UserCode.SIMPLE,UserCode.TEST,UserCode.SIMPLE));
 
-        long bit2=toBit(UserCode.SIMPLE,UserCode.CODE0,UserCode.SIMPLE);
+        long bit2= toMask(UserCode.SIMPLE,UserCode.CODE0,UserCode.SIMPLE);
 
-        Assert.assertTrue(bitInAny(bit2,UserCode.SIMPLE,UserCode.CODE4,UserCode.CODE0));
-        Assert.assertFalse(bitInAny(bit2,UserCode.CODE1,UserCode.CODE4,UserCode.CODE5));
+        Assert.assertTrue(maskInAny(bit2,UserCode.SIMPLE,UserCode.CODE4,UserCode.CODE0));
+        Assert.assertFalse(maskInAny(bit2,UserCode.CODE1,UserCode.CODE4,UserCode.CODE5));
 
         for (UserCode userCode : UserCode.values()) {
             Assert.assertTrue(userCode.in(bit));
         }
 
-        List<UserCode> codes = getByBit(UserCode.class, bit);
+        List<UserCode> codes = getByMask(UserCode.class, bit);
 
 
     }

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

@@ -83,7 +83,7 @@ public enum UserCode implements EnumDict {
     private String comments;
 
     @Override
-    public boolean writeJSONObject() {
+    public boolean isWriteJSONObjectEnabled() {
         return true;
     }
 }