Pregunta

Estoy usando mybatis con la integración de primavera como se describe aquí.

Estoy usando la API Joda Date en lugar de la API de fecha Java, ahora lo difícil es asegurar que MyBatis reconoce la API de Joda Fecha y me permite consultar lo mismo.

Ahora la forma documentada de lograr esto es usar un DataTypeHandler

Supongo que si usamos las anotaciones correctas, MyBatis recogerá el controlador personalizado y lo registrará con SQLSessionFactory.

Entonces mi clase se ve como

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

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

De alguna manera, esto no registra mi controlador de tipo personalizado ..., lo que tengo que hacer, es escribir un código como este al inicio de la aplicación ...

 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);

Sé que parece basura y quiero evitarlo, ¿no puedo hacer que mybatis escanee mi aplicación para estas anotaciones y luego registre mi manejador de tipo personalizado automáticamente?

Estoy seguro de que mi tipo no se ha registrado (usando solo las anotaciones) porque hice una inspección en el código mybatis y no pude encontrar mi manejador allí ...

¿Fue útil?

Solución

Me encontré con el mismo problema, también para un Joda DateTime TypeHandler. Rastreando, veo que el manejador es realmente registrado. Sin embargo, TypeHandlerRegistry.getTypeHandler parece usar un null JDBCType para buscar el controlador.

Ahora, la última línea en su fragmento de código anterior registra explícitamente un controlador para null JDBCTYPE. Desafortunadamente, parece ser imposible incluir null en el @MappedJdbcTypes anotación. Entonces eso me parece un error.

Ah, y es posible que pueda eliminar el @MappedJdbcTypes anotación en total, para que funcione.

ACTUALIZAR:

Así es como me configuré en mi ApplicationContext.xml:

<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>

Si recoge a los manejadores de tipo escaneando un paquete como este, puede establecer el nivel de registro de myBatis para depurar para ver cuáles intenta agregar.

Mi TypeHandler comienza así:

@MappedTypes(DateTime.class)
public class DateTimeTypeHandler implements TypeHandler<DateTime> {...}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top