Mybatis에서 ExceptionTranslator 설정하는 방법
개발 환경 : Hsql, mybatis
개발 중인 코드에서 column에 지정된 길이보다 긴 문자열을 insert 나 update 하였을때, Mybais에서는DataIntegrityViolationException이 발생한다.
여기서 문제는 DataIntegrityViolationException의 의미가 너무나 광범위 하다는 점이다.
그래서 구글링 해본 결과 ExceptionTranslator라는 개념과 Exception의 원인과 코드 값을 알 수 있는 getRootCause() 및 getErrorCode()를 찾을 수 있었다.
참고 자료에서는 JdbcTemplate에서 ExceptionTranslator를 주입하라는 것인데,
현재 개발 환경은 mybatis 이므로 mybatis 내에서 유사 기능이 있는지 확인하기 위해 구글링을 하였다.
그래서 발견한 문서는 다음과 같다.
질문을 보면 "ExceptionTranslator를 주입하고 싶은데 해당 property가 없다 어떻하냐?"
의 내용인데 다행히도 해당 내용에 대한 답변이 있고 설명도 잘 되어 있다.
답변을 간단하게 설명하면 "sqlSessionTemplate에서 exceptionTranslator를 생성자를 통해 주입이 하라"는 말이다.
위 내용을 바탕으로 구현한 context는 다음과 같다.
< bean id= "sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" >
< property name= "dataSource" ref = "securityDataSource" />
< property name= "configLocation" value ="classpath:/db/mybatisConfigure.xml" />
< property name= "mapperLocations" value ="classpath:/db/hsql/mapper/security/*" />
</ bean>
< bean id= "exceptionTranslator" class ="com.mspark.api.db.mybatis.MybatisHsqlExceptionTranslator" >
< constructor-arg name= "dataSource" ref = "securityDataSource"/>
< constructor-arg name= "exceptionTranslatorLazyInit" value= "true"/>
</ bean>
< bean id= "sqlSessionTemplate" class ="org.mybatis.spring.SqlSessionTemplate" >
< constructor-arg name= "sqlSessionFactory" ref = "sqlSessionFactory" />
< constructor-arg name= "executorType" value ="#{sqlSessionFactory.configuration.defaultExecutorType}" ></ constructor-arg>
< constructor-arg name= "exceptionTranslator" ref ="exceptionTranslator" />
</ bean>
<!-- DAO -->
< bean id= "parentDao" class = "org.mybatis.spring.mapper.MapperFactoryBean" abstract ="true" >
< property name= "sqlSessionTemplate" ref ="sqlSessionTemplate" ></ property>
</ bean>
< bean id= "userDao" parent = "parentDao">
< property name= "mapperInterface" value ="com.mspark.api.db.dao.UserDao" />
</ bean>
< bean id= "authorityDao" parent = "parentDao">
< property name= "mapperInterface" value ="com.mspark.api.db.dao.AuthorityDao" />
</ bean>
< bean id= "roleDao" parent = "parentDao">
< property name= "mapperInterface" value ="com.mspark.api.db.dao.RoleDao" />
</ bean>
|
그리고 확장 구현한 ExceptionTranslator
public class MybatisHsqldbExceptionTranslator extends
MyBatisExceptionTranslator { public MybatisHsqldbExceptionTranslator(DataSource dataSource, boolean exceptionTranslatorLazyInit) { super(dataSource, exceptionTranslatorLazyInit); // TODO Auto-generated constructor stub } public DataAccessException translateExceptionIfPossible (RuntimeException e) { DataAccessException dataAccessException = super .translateExceptionIfPossible(e); if (dataAccessException.getRootCause() instanceof SQLDataException){ int code = ((SQLDataException)dataAccessException.getRootCause()).getErrorCode(); return _mappingCodeToException(code, dataAccessException); } else { return dataAccessException; } } private DataAccessException _mappingCodeToException( int code, DataAccessException dataAccessException) { switch (code) { case 3401: return new DatatooLongException(dataAccessException.getMessage(), dataAccessException.getCause()); } return dataAccessException; } } |
한번 구현 했으니...나중에 잘 써먹어야지 ^^
댓글
댓글 쓰기