반응형

Spring boot + Mybatis 로 프로젝트를 진행하고 있었습니다.

그런데 잘 되던 녀석이 갑자기 Exception이 나면서 구동이 안되는 겁니다.

ClassNotFound 라니 정말 당황했습니다. ㄷㄷㄷ


환경(Environment)

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
    <relativePath /<!-- lookup parent from repository -->
  </parent>
 
 
<dependencies>
...
    <!-- mybaits -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.2.1</version>
    </dependency>
...
</dependencies>


mybatis/config.xml

1
2
3
4
  <typeAliases>
    <package name="kr.co.tistory.goni9071.dao" />
    <package name="kr.co.tistory.goni9071.entity" />
  </typeAliases>



문제(Problem)

1. Mybatis 설정에서 TypeAliases의 package 를 이용하면 Entity 파일을 인식하지 못함.

2. 더 당황스러운 건 STS 개발환경에서는 문제가 없으나  executable jar/war 에서만 오류가 발생.


Exception

1
2
3
4
5
6
7
8
9
10
$ java -jar target/xxxx.jar
...
        at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:118)
        ... 44 more
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'Message'.  Cause: java.lang.ClassNotFoundException: Cannot find class: Message
        at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:120)
        at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:149)
        at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:116)
        ... 48 more
...



원인(Cause)

1. application.properties 에서 아래와 같이 설정시에는 문제가 없음.

1
2
#mybatis
mybatis.config-location=classpath:mybatis/config.xml


2.  그러나 아래처럼 Java Config를 이용해 수동으로 설정시 오류가 발생.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
@MapperScan(value = Constants.PACKAGE_BASE + ".dao", sqlSessionFactoryRef = "coreSqlSessionFactory")
public class CoreRepositoryConfig {
 
  @Bean(name = "coreSqlSessionFactory")
  @Primary
  public SqlSessionFactory coreSqlSessionFactory(@Qualifier("coreDatasource") DataSource coreDatasource,
      ApplicationContext applicationContext) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(coreDatasource);
    sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis/config.xml"));
    // 문제의 주범 및 해결책
    sqlSessionFactoryBean.setVfs(SpringBootVFS.class); 
    //
    return sqlSessionFactoryBean.getObject();
  }
}



해결책(Solution)

1. 위의 코드처럼 아래 한줄이 추가되면 문제 해결.

1
sqlSessionFactoryBean.setVfs(SpringBootVFS.class); 




반응형

+ Recent posts