Skip to content

Commit 2911ee4

Browse files
authored
Merge pull request #324 from kazuki43zoo/gh-323
Detect a TypeHandler from DI Container
2 parents 9aa9096 + 48582ae commit 2911ee4

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.ibatis.session.Configuration;
2626
import org.apache.ibatis.session.ExecutorType;
2727
import org.apache.ibatis.session.SqlSessionFactory;
28+
import org.apache.ibatis.type.TypeHandler;
2829
import org.mybatis.spring.SqlSessionFactoryBean;
2930
import org.mybatis.spring.SqlSessionTemplate;
3031
import org.mybatis.spring.mapper.ClassPathMapperScanner;
@@ -84,6 +85,8 @@ public class MybatisAutoConfiguration implements InitializingBean {
8485

8586
private final Interceptor[] interceptors;
8687

88+
private final TypeHandler[] typeHandlers;
89+
8790
private final ResourceLoader resourceLoader;
8891

8992
private final DatabaseIdProvider databaseIdProvider;
@@ -92,11 +95,13 @@ public class MybatisAutoConfiguration implements InitializingBean {
9295

9396
public MybatisAutoConfiguration(MybatisProperties properties,
9497
ObjectProvider<Interceptor[]> interceptorsProvider,
98+
ObjectProvider<TypeHandler[]> typeHandlersProvider,
9599
ResourceLoader resourceLoader,
96100
ObjectProvider<DatabaseIdProvider> databaseIdProvider,
97101
ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
98102
this.properties = properties;
99103
this.interceptors = interceptorsProvider.getIfAvailable();
104+
this.typeHandlers = typeHandlersProvider.getIfAvailable();
100105
this.resourceLoader = resourceLoader;
101106
this.databaseIdProvider = databaseIdProvider.getIfAvailable();
102107
this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable();
@@ -143,6 +148,9 @@ public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Excepti
143148
if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
144149
factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
145150
}
151+
if (!ObjectUtils.isEmpty(this.typeHandlers)) {
152+
factory.setTypeHandlers(this.typeHandlers);
153+
}
146154
if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
147155
factory.setMapperLocations(this.properties.resolveMapperLocations());
148156
}

mybatis-spring-boot-autoconfigure/src/site/xdoc/index.xml.vm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ public SqlSessionFactory masterSqlSessionFactory() throws Exception {
389389

390390
<ul>
391391
<li><a href="http://www.mybatis.org/mybatis-3/configuration.html#plugins">Interceptor</a></li>
392+
<li><a href="http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers">TypeHandler(Available since 2.1.0)</a></li>
392393
<li><a href="http://www.mybatis.org/mybatis-3/configuration.html#databaseIdProvider">DatabaseIdProvider</a></li>
393394
</ul>
394395

mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfigurationTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@
1616
package org.mybatis.spring.boot.autoconfigure;
1717

1818
import java.math.BigInteger;
19+
import java.sql.CallableStatement;
20+
import java.sql.PreparedStatement;
21+
import java.sql.ResultSet;
22+
import java.sql.SQLException;
1923
import java.util.Map;
2024
import java.util.Properties;
25+
import java.util.UUID;
2126

2227
import javax.sql.DataSource;
2328

@@ -32,6 +37,8 @@
3237
import org.apache.ibatis.session.ExecutorType;
3338
import org.apache.ibatis.session.SqlSessionFactory;
3439
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
40+
import org.apache.ibatis.type.BaseTypeHandler;
41+
import org.apache.ibatis.type.JdbcType;
3542
import org.apache.ibatis.type.TypeHandlerRegistry;
3643
import org.junit.jupiter.api.AfterEach;
3744
import org.junit.jupiter.api.BeforeEach;
@@ -238,6 +245,20 @@ void testWithInterceptors() {
238245
this.context.close();
239246
}
240247

248+
@Test
249+
void testWithTypeHandlers() {
250+
this.context.register(EmbeddedDataSourceConfiguration.class,
251+
MybatisTypeHandlerConfiguration.class,
252+
MybatisAutoConfiguration.class,
253+
PropertyPlaceholderAutoConfiguration.class);
254+
this.context.refresh();
255+
assertThat(this.context.getBeanNamesForType(SqlSessionFactory.class)).hasSize(1);
256+
assertThat(this.context.getBeanNamesForType(SqlSessionTemplate.class)).hasSize(1);
257+
assertThat(this.context.getBean(SqlSessionFactory.class).getConfiguration().getTypeHandlerRegistry()
258+
.getTypeHandler(UUID.class)).isInstanceOf(MyTypeHandler.class);
259+
this.context.close();
260+
}
261+
241262
@Test
242263
void testWithDatabaseIdProvider() {
243264
this.context.register(EmbeddedDataSourceConfiguration.class,
@@ -600,6 +621,17 @@ public MyInterceptor myInterceptor() {
600621

601622
}
602623

624+
@Configuration
625+
@EnableAutoConfiguration
626+
static class MybatisTypeHandlerConfiguration {
627+
628+
@Bean
629+
public MyTypeHandler myTypeHandler() {
630+
return new MyTypeHandler();
631+
}
632+
633+
}
634+
603635
@Configuration
604636
@EnableAutoConfiguration
605637
static class MybatisPropertiesConfigurationCustomizer {
@@ -719,4 +751,28 @@ static class MySqlSessionTemplate extends SqlSessionTemplate {
719751
}
720752
}
721753

754+
static class MyTypeHandler extends BaseTypeHandler<UUID> {
755+
756+
@Override
757+
public void setNonNullParameter(PreparedStatement ps, int i, UUID parameter, JdbcType jdbcType) throws SQLException {
758+
759+
}
760+
761+
@Override
762+
public UUID getNullableResult(ResultSet rs, String columnName) throws SQLException {
763+
return null;
764+
}
765+
766+
@Override
767+
public UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
768+
return null;
769+
}
770+
771+
@Override
772+
public UUID getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
773+
return null;
774+
}
775+
776+
}
777+
722778
}

0 commit comments

Comments
 (0)