diff --git a/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java b/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java index f501953995..e5e3151fda 100644 --- a/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java +++ b/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java @@ -120,6 +120,9 @@ public class SqlSessionFactoryBean private String typeHandlersPackage; + @SuppressWarnings("rawtypes") + private Class defaultEnumTypeHandler; + private Class[] typeAliases; private String typeAliasesPackage; @@ -293,6 +296,18 @@ public void setTypeHandlers(TypeHandler... typeHandlers) { this.typeHandlers = typeHandlers; } + /** + * Set the default type handler class for enum. + * + * @since 2.0.5 + * @param defaultEnumTypeHandler + * The default type handler class for enum + */ + public void setDefaultEnumTypeHandler( + @SuppressWarnings("rawtypes") Class defaultEnumTypeHandler) { + this.defaultEnumTypeHandler = defaultEnumTypeHandler; + } + /** * List of type aliases to register. They can be annotated with {@code Alias} * @@ -545,6 +560,8 @@ protected SqlSessionFactory buildSqlSessionFactory() throws Exception { }); } + targetConfiguration.setDefaultEnumTypeHandler(defaultEnumTypeHandler); + if (!isEmpty(this.scriptingLanguageDrivers)) { Stream.of(this.scriptingLanguageDrivers).forEach(languageDriver -> { targetConfiguration.getLanguageRegistry().register(languageDriver); diff --git a/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java b/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java index d373ff51db..35c6f69541 100644 --- a/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java +++ b/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java @@ -1,5 +1,5 @@ /** - * Copyright 2010-2019 the original author or authors. + * Copyright 2010-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,6 @@ import org.apache.ibatis.reflection.factory.ObjectFactory; import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; -import org.apache.ibatis.scripting.LanguageDriver; import org.apache.ibatis.scripting.LanguageDriverRegistry; import org.apache.ibatis.scripting.defaults.RawLanguageDriver; import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; @@ -40,9 +39,9 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.apache.ibatis.type.EnumOrdinalTypeHandler; import org.apache.ibatis.type.TypeAliasRegistry; import org.apache.ibatis.type.TypeException; -import org.apache.ibatis.type.TypeHandler; import org.apache.ibatis.type.TypeHandlerRegistry; import org.junit.jupiter.api.Test; import org.mybatis.core.jdk.type.AtomicNumberTypeHandler; @@ -52,7 +51,6 @@ import org.mybatis.spring.type.SuperType; import org.mybatis.spring.type.TypeHandlerFactory; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; import com.mockrunner.mock.jdbc.MockDataSource; @@ -423,6 +421,15 @@ void testSearchATypeHandlerPackageWithSamePackage() throws Exception { assertThat(typeHandlerRegistry.hasTypeHandler(BigDecimal.class)).isTrue(); } + @Test + void testDefaultEnumTypeHandler() throws Exception { + setupFactoryBean(); + factoryBean.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class); + + TypeHandlerRegistry typeHandlerRegistry = factoryBean.getObject().getConfiguration().getTypeHandlerRegistry(); + assertThat(typeHandlerRegistry.getTypeHandler(MyEnum.class)).isInstanceOf(EnumOrdinalTypeHandler.class); + } + @Test void testSetObjectFactory() throws Exception { setupFactoryBean(); @@ -515,4 +522,7 @@ private static class MyLanguageDriver1 extends RawLanguageDriver { private static class MyLanguageDriver2 extends RawLanguageDriver { } + private static enum MyEnum { + } + }