2012-01-11 3 views
4

here과 같이 Spring Integration과 함께 MyBatis를 사용하고 있습니다.MyBatis/Spring에서 사용자 정의 유형 사용하기

Java Date API 대신 Joda Date API를 사용하고 있습니다. 이제는 MyBatis가 Joda Date API를 인식하고이를 쿼리 할 수 ​​있습니다.

지금 이것을 달성하기 위해 문서화 된 방법은 우리가 올바른 주석을 사용하는 경우, MyBatis로 사용자 정의 핸들러를 선택하고 SqlSessionFactory는에 등록됩니다 가정 오전 DateTypeHandler

을 사용하는 것입니다.

그래서 내 수업 보이는이 내 사용자 정의 타입 핸들러를 등록하지 않는 방법

@MappedTypes(value = DateTime.class) 
@MappedJdbcTypes(value = {JdbcType.DATE,JdbcType.TIME,JdbcType.TIMESTAMP}) 

public class MyBatisJodaDateTimeType extends DateTypeHandler { 
...... 
..... 
} 

일부처럼 ..., 내가 필요하고 무엇을, 응용 프로그램 시작시이 같은 코드를 작성 ...

입니다
SqlSessionFactory mybatisSessionFactory = applicationContext.getBean("sqlSessionFactory", SqlSessionFactory.class); 
     MyBatisJodaDateTimeType myBatisJodaDateTimeType = applicationContext.getBean("myBatisJodaDateTimeType", MyBatisJodaDateTimeType.class); 

     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, JdbcType.DATE, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, JdbcType.TIME, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, JdbcType.TIMESTAMP, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, null, myBatisJodaDateTimeType); 

나는 쓰레기처럼 보입니다. 나는 그것을 피하고 싶습니다. MyBatis가 내 애플리케이션을 검색하여 내 사용자 정의 유형 핸들러를 자동으로 등록 할 수 없습니까?

나는 내가이의 MyBatis 코드를 검사했고, 거기에 내 처리기를 찾을 수 있기 때문에 (단지 주석을 사용) 내 타입이 등록되지 않았 음을 확신합니다 ....

답변

4

나는 같은 문제로 실행 또한 Joda DateTime TypeHandler에 대해서도 마찬가지입니다. 추적하면, 처리기 은 실제로입니다. 그러나 TypeHandlerRegistry.getTypeHandlernull jdbcType을 사용하여 처리기를 조회하는 것으로 보입니다.

이제 위 코드 조각의 마지막 줄에 null JdbcType에 대한 처리기가 명시 적으로 등록됩니다. 죄송 합니다만 @MappedJdbcTypes 주석에 null을 포함시키는 것은 불가능한 것 같습니다. 그래서 저에게는 버그처럼 보입니다.

아, 작동하지 않게하려면 @MappedJdbcTypes 특수 효과를 완전히 삭제해야 할 수도 있습니다.

UPDATE :

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mapperLocations" value="classpath*:META-INF/persistence/*.xml" /> 
    <property name="typeAliasesPackage" value="com.mycompany.data" /> 
    <property name="typeHandlersPackage" value="com.mycompany.typehandler" /> 
</bean> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.mycompany.persistence" /> 
</bean> 

이 같은 패키지를 스캔하여 입력 핸들러를 선택하는 경우, 디버그에의 MyBatis 로깅 수준을 설정할 수 있습니다

다음

내가 내 applicationContext.xml에 설정 방법 그것을 추가하려는 시도를 확인하십시오.

내 TypeHandler는 다음과 같이 시작합니다

@MappedTypes(DateTime.class) 
public class DateTimeTypeHandler implements TypeHandler<DateTime> {...} 
+0

당신은 우리가 Typehandler에 배치 주석을 제거하고 또한 핸들러의 수동 등록을 수행하는 코드를 제거 할 수 있음을 시사하고 있습니까? 어쩌면 작동 할 수 있을까요? ... 방금 시나리오를 테스트했는데 성공하지 못했습니다. – Sudarshan

+0

예, 최신 MyBatis 릴리스에서 선택 및 업데이트를 위해 직접 작업 한 것입니다. 따라서 유일한 주석은 @MappedTypes (DateTime.class)입니다. – usethe4ce

+0

어떤 버전을 알려주시겠습니까? MyBatis와 스프링 통합을 사용한다면? – Sudarshan

관련 문제