聂秋秋 5 gadi atpakaļ
vecāks
revīzija
3fee08cdb7

+ 40 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/MybatisEnumTypeHandler.java

@@ -61,10 +61,7 @@ public class MybatisEnumTypeHandler<E extends Enum<?>> extends BaseTypeHandler<E
         MetaClass metaClass = MetaClass.forClass(type, reflectorFactory);
         String name = "value";
         if (!IEnum.class.isAssignableFrom(type)) {
-            name = TABLE_METHOD_OF_ENUM_TYPES.computeIfAbsent(type.getName(), k -> {
-                Field field = dealEnumType(this.type).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find @EnumValue in Class: %s.", type.getName())));
-                return field.getName();
-            });
+            name = findEnumValueFiledName(this.type).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find @EnumValue in Class: %s.", this.type.getName())));
         }
         this.invoker = metaClass.getGetInvoker(name);
     }
@@ -105,10 +102,49 @@ public class MybatisEnumTypeHandler<E extends Enum<?>> extends BaseTypeHandler<E
         return this.valueOf(this.type, cs.getObject(columnIndex));
     }
 
+    /**
+     * 查找标记EnumValue字段
+     *
+     * @param clazz class
+     * @return EnumValue字段
+     * @deprecated 3.3.1 {@link #findEnumValueFiledName(Class)}
+     */
+    @Deprecated
     public static Optional<Field> dealEnumType(Class<?> clazz) {
         return clazz.isEnum() ? Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.isAnnotationPresent(EnumValue.class)).findFirst() : Optional.empty();
     }
 
+    /**
+     * 查找标记标记EnumValue字段
+     *
+     * @param clazz class
+     * @return EnumValue字段
+     * @since 3.3.1
+     */
+    public static Optional<String> findEnumValueFiledName(Class<?> clazz) {
+        if (clazz != null && clazz.isEnum()) {
+            String className = clazz.getName();
+            return Optional.ofNullable(TABLE_METHOD_OF_ENUM_TYPES.computeIfAbsent(className, key -> {
+                Optional<Field> optional = Arrays.stream(clazz.getDeclaredFields())
+                    .filter(field -> field.isAnnotationPresent(EnumValue.class))
+                    .findFirst();
+                return optional.map(Field::getName).orElse(null);
+            }));
+        }
+        return Optional.empty();
+    }
+
+    /**
+     * 判断是否为MP枚举处理
+     *
+     * @param clazz class
+     * @return 是否为MP枚举处理
+     * @since 3.3.1
+     */
+    public static boolean isMpEnums(Class<?> clazz) {
+        return clazz != null && clazz.isEnum() && (IEnum.class.isAssignableFrom(clazz) || findEnumValueFiledName(clazz).isPresent());
+    }
+
     private E valueOf(Class<E> enumClass, Object value) {
         E[] es = enumClass.getEnumConstants();
         return Arrays.stream(es).filter((e) -> equalsValue(value, getValue(e))).findAny().orElse(null);

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/spring/MybatisSqlSessionFactoryBean.java

@@ -503,7 +503,7 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
             TypeHandlerRegistry typeHandlerRegistry = targetConfiguration.getTypeHandlerRegistry();
             classes.stream()
                 .filter(Class::isEnum)
-                .filter(cls -> IEnum.class.isAssignableFrom(cls) || MybatisEnumTypeHandler.dealEnumType(cls).isPresent())
+                .filter(MybatisEnumTypeHandler::isMpEnums)
                 .forEach(cls -> typeHandlerRegistry.register(cls, MybatisEnumTypeHandler.class));
         }
 

+ 27 - 16
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/handlers/MybatisEnumTypeHandlerTest.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.enums.IEnum;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import org.apache.ibatis.type.JdbcType;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -35,36 +36,46 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
     private static final MybatisEnumTypeHandler<SexEnum> SEX_ENUM_ENUM_TYPE_HANDLER = new MybatisEnumTypeHandler<>(SexEnum.class);
 
     private static final MybatisEnumTypeHandler<GradeEnum> GRADE_ENUM_ENUM_TYPE_HANDLER = new MybatisEnumTypeHandler<>(GradeEnum.class);
-    
+
     @Getter
     @AllArgsConstructor
     enum SexEnum implements IEnum<Integer> {
-        
+
         MAN(1, "1"),
         WO_MAN(2, "2");
         Integer code;
         String desc;
-        
+
         @Override
         public Integer getValue() {
             return this.code;
         }
     }
-    
+
     @Getter
     @AllArgsConstructor
     enum GradeEnum {
-        
+
         PRIMARY(1, "小学"),
         SECONDARY(2, "中学"),
         HIGH(3, "高中");
-        
+
         @EnumValue
         private final int code;
-        
+
         private final String desc;
     }
-    
+
+    @Test
+    void dealEnumType(){
+        Assertions.assertFalse(MybatisEnumTypeHandler.dealEnumType(String.class).isPresent());
+        Assertions.assertTrue(MybatisEnumTypeHandler.dealEnumType(GradeEnum.class).isPresent());
+        Assertions.assertFalse(MybatisEnumTypeHandler.dealEnumType(SexEnum.class).isPresent());
+        Assertions.assertFalse(MybatisEnumTypeHandler.findEnumValueFiledName(String.class).isPresent());
+        Assertions.assertTrue(MybatisEnumTypeHandler.findEnumValueFiledName(GradeEnum.class).isPresent());
+        Assertions.assertFalse(MybatisEnumTypeHandler.findEnumValueFiledName(SexEnum.class).isPresent());
+    }
+
     @Test
     @Override
     public void setParameter() throws Exception {
@@ -74,7 +85,7 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         verify(preparedStatement).setObject(2, 2);
         SEX_ENUM_ENUM_TYPE_HANDLER.setParameter(preparedStatement, 3, null, JdbcType.INTEGER);
         verify(preparedStatement).setNull(3, JdbcType.INTEGER.TYPE_CODE);
-        
+
         GRADE_ENUM_ENUM_TYPE_HANDLER.setParameter(preparedStatement, 4, GradeEnum.PRIMARY, null);
         verify(preparedStatement).setObject(4, 1);
         GRADE_ENUM_ENUM_TYPE_HANDLER.setParameter(preparedStatement, 5, GradeEnum.SECONDARY, null);
@@ -82,7 +93,7 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         GRADE_ENUM_ENUM_TYPE_HANDLER.setParameter(preparedStatement, 6, null, JdbcType.INTEGER);
         verify(preparedStatement).setNull(6, JdbcType.INTEGER.TYPE_CODE);
     }
-    
+
     @Test
     @Override
     public void getResultFromResultSetByColumnName() throws Exception {
@@ -93,14 +104,14 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         when(resultSet.getObject("column")).thenReturn(2);
         assertEquals(SexEnum.WO_MAN, SEX_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, "column"));
         when(resultSet.getObject("column")).thenReturn(null);
-        
+
         assertNull(GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, "column"));
         when(resultSet.getObject("column")).thenReturn(1);
         assertEquals(GradeEnum.PRIMARY, GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, "column"));
         when(resultSet.getObject("column")).thenReturn(2);
         assertEquals(GradeEnum.SECONDARY, GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, "column"));
     }
-    
+
     @Test
     @Override
     public void getResultFromResultSetByColumnIndex() throws Exception {
@@ -110,7 +121,7 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         assertEquals(SexEnum.WO_MAN, SEX_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, 2));
         when(resultSet.getObject(3)).thenReturn(null);
         assertNull(SEX_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, 3));
-        
+
         when(resultSet.getObject(4)).thenReturn(1);
         assertEquals(GradeEnum.PRIMARY, GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, 4));
         when(resultSet.getObject(5)).thenReturn(2);
@@ -118,7 +129,7 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         when(resultSet.getObject(6)).thenReturn(null);
         assertNull(GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(resultSet, 6));
     }
-    
+
     @Test
     @Override
     public void getResultFromCallableStatement() throws Exception {
@@ -128,7 +139,7 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         assertEquals(SexEnum.WO_MAN, SEX_ENUM_ENUM_TYPE_HANDLER.getResult(callableStatement, 2));
         when(callableStatement.getObject(3)).thenReturn(null);
         assertNull(SEX_ENUM_ENUM_TYPE_HANDLER.getResult(callableStatement, 3));
-    
+
         when(callableStatement.getObject(4)).thenReturn(1);
         assertEquals(GradeEnum.PRIMARY, GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(callableStatement, 4));
         when(callableStatement.getObject(5)).thenReturn(2);
@@ -136,5 +147,5 @@ public class MybatisEnumTypeHandlerTest extends BaseTypeHandlerTest {
         when(callableStatement.getObject(6)).thenReturn(null);
         assertNull(GRADE_ENUM_ENUM_TYPE_HANDLER.getResult(callableStatement, 6));
     }
-    
+
 }