MyBatis에서 TypeHandler
를 정의하고 사용하려고 하니 org.apache.ibatis.type.TypeException
이 발생했다. javaType으로 정의한 클래스를 찾을 수 없다는 내용이었는데 이해할 수가 없었다. 분명히 클래스는 존재했다.
public class Sample {
...
public enum Type {
...
}
}
<typeHandlers>
<typeHandler javaType="com.example.Sample.Type" handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" />
</typeHandlers>
직감적으로 inner class로 인한 문제로 추측되어 Type 클래스를 inner class가 아닌 별도의 클래스로 생성해서 테스트를 해봤다. 역시 잘 된다.
이유를 확인하기 위해 TypeException
이 발생한 곳을 찾아봤다. TypeAliasRegistry 클래스에서 미리 정의된 클래스 타입이 아니라면 ClassLoader
를 통해서 찾게 되는데 이렇게 클래스 파일을 직접 찾으므로 내부 클래스의 경우 컴파일된 실제 클래스명을 지정해야 된다.
<typeHandlers>
<typeHandler javaType="com.example.Sample$Type" handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" />
</typeHandlers>
com.example.Sample.Type
이 아닌 com.example.Sample$Type
으로 해야지만 정상적으로 처리가 가능하다.