Closed
Description
version
mybatis-spring 2.0.1
mybatis 3.5.1
It will throw org.apache.ibatis.type.TypeException
, when exist two SQL provider.
In class org.mybatis.spring.SqlSessionFactoryBean
, line 464, it invoke registerAlias(Class<?> type)
directly, skip registerAliases(String packageName, Class<?> superType)
. In old version ,registerAlias(Class<?> type)
was invoke by registerAliases(String packageName, Class<?> superType)
, will skip some classes.
TypeAliasRegistry
public void registerAliases(String packageName, Class<?> superType) {
ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<>();
resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();
for (Class<?> type : typeSet) {
// Ignore inner classes and interfaces (including package-info.java)
// Skip also inner classes. See issue #6
if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
registerAlias(type);
}
}
}
public void registerAlias(Class<?> type) {
String alias = type.getSimpleName();
Alias aliasAnnotation = type.getAnnotation(Alias.class);
if (aliasAnnotation != null) {
alias = aliasAnnotation.value();
}
registerAlias(alias, type);
}
config
mybatis:
type-aliases-package: io.github.cd871127
Mapper
@Mapper
public interface TestMapper {
@SelectProvider(type = TestProvider.class, method = "test")
String test();
class TestProvider {
public String test() {
return new SQL() {{
SELECT("a");
FROM("test");
}}.toString();
}
}
}
@Mapper
public interface Test2Mapper {
@SelectProvider(type = Test2Provider.class, method = "test")
String test();
class Test2Provider {
public String test() {
return new SQL() {{
SELECT("a");
FROM("test");
}}.toString();
}
}
}
Exctption
Caused by: org.apache.ibatis.type.TypeException: The alias '' is already mapped to the value 'io.github.cd871127.hodgepodge.cloud.t66y.mapper.TestMapper$TestProvider$1'.
at org.apache.ibatis.type.TypeAliasRegistry.registerAlias(TypeAliasRegistry.java:157)
at org.apache.ibatis.type.TypeAliasRegistry.registerAlias(TypeAliasRegistry.java:147)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:464)
at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:424)
at org.mybatis.spring.SqlSessionFactoryBean.getObject(SqlSessionFactoryBean.java:554)
at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.sqlSessionFactory(MybatisAutoConfiguration.java:150)
at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$fe1ce91f.CGLIB$sqlSessionFactory$0(<generated>)
at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$fe1ce91f$$FastClassBySpringCGLIB$$6ab7cac8.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
at org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration$$EnhancerBySpringCGLIB$$fe1ce91f.sqlSessionFactory(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 64 common frames omitted