diff --git a/src/main/java/org/apache/ibatis/type/TypeHandlerRegistry.java b/src/main/java/org/apache/ibatis/type/TypeHandlerRegistry.java index 4d5cb6b00e0..425d242a65f 100644 --- a/src/main/java/org/apache/ibatis/type/TypeHandlerRegistry.java +++ b/src/main/java/org/apache/ibatis/type/TypeHandlerRegistry.java @@ -238,10 +238,11 @@ private Map> getJdbcHandlerMap(Type type) { private Map> getJdbcHandlerMapForEnumInterfaces(Class clazz) { for (Class iface : clazz.getInterfaces()) { Map> jdbcHandlerMap = TYPE_HANDLER_MAP.get(iface); + if (jdbcHandlerMap == null) { + jdbcHandlerMap = getJdbcHandlerMapForEnumInterfaces(iface); + } if (jdbcHandlerMap != null) { return jdbcHandlerMap; - } else { - return getJdbcHandlerMapForEnumInterfaces(iface); } } return null; diff --git a/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java b/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java index 2a18dce7560..88acffe80c3 100644 --- a/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java +++ b/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java @@ -159,9 +159,19 @@ class MyDate2 extends MyDate1 { interface SomeInterface { } + interface ExtendingSomeInterface extends SomeInterface { + } + interface NoTypeHandlerInterface { + } enum SomeEnum implements SomeInterface { } + enum ExtendingSomeEnum implements ExtendingSomeInterface { + } + enum ImplementingMultiInterfaceSomeEnum implements NoTypeHandlerInterface, ExtendingSomeInterface { + } + enum NoTypeHandlerInterfaceEnum implements NoTypeHandlerInterface { + } class SomeClass implements SomeInterface { } @@ -190,6 +200,10 @@ public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLExce public void demoTypeHandlerForSuperInterface() { typeHandlerRegistry.register(SomeInterfaceTypeHandler.class); assertNull("Registering interface works only for enums.", typeHandlerRegistry.getTypeHandler(SomeClass.class)); + assertSame("When type handler for interface is not exist, apply default enum type handler.", + EnumTypeHandler.class, typeHandlerRegistry.getTypeHandler(NoTypeHandlerInterfaceEnum.class).getClass()); assertSame(SomeInterfaceTypeHandler.class, typeHandlerRegistry.getTypeHandler(SomeEnum.class).getClass()); + assertSame(SomeInterfaceTypeHandler.class, typeHandlerRegistry.getTypeHandler(ExtendingSomeEnum.class).getClass()); + assertSame(SomeInterfaceTypeHandler.class, typeHandlerRegistry.getTypeHandler(ImplementingMultiInterfaceSomeEnum.class).getClass()); } }