Skip to content

There is case that fail to register type alias when exists anonymous class since mybatis-spring 2.0.1 #362

Closed
@ifrit2000

Description

@ifrit2000

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions