1

我正在尝试IntegerTypeHandler从我的一个结果地图org.apache.ibatis.type的包中配置默认​​值。MyBatis 3.2.1

给定以下构造函数签名:

public Activity(int id, String name, String color, ActivityType type,
            int idOfOwnerClient) {
    //validations and fields initializations
}

我正在尝试将SQL NULLvalue 转换为intwith value 0,因为该字段int idOfOwnerClient是可选的,因此数据库可能具有NULL值。

如果尝试将 a 传递null给原始类型,例如intException则会抛出 an ,为了解决这个问题,我正在配置 a TypeHandler

这是我的一个片段mybatis-config.xml

<configuration>
    <typeAliases>
        <typeAlias alias="intTypeHandler" type="org.apache.ibatis.type.IntegerTypeHandler"/>
    </typeAliases>
</configuration>

和我的结果映射的片段(注意最后一个 arg 元素的类型处理程序):

    <resultMap type="Activity" id="activityResult">
        <constructor>
            <idArg column="activity.id" javaType="_int"/>
            <arg column="activity.name" javaType="String"/>
            <arg column="activity.color" javaType="String"/>
            <arg resultMap="ActivityTypeMapper.activityTypeResult" javaType="ActivityType"/>
            <arg column="activity.id_client" javaType="_int" typeHandler="intTypeHandler"/>
        </constructor>
    </resultMap>

但是,当我运行 junit 测试时,出现以下错误(注意错误null末尾的值):

org.mybatis.spring.MyBatisSystemException: nested exception is 
org.apache.ibatis.reflection.ReflectionException: Error instantiating class 
br.com.agrofficio.kpifarm.model.Activity with invalid types 
(int,String,String,ActivityType,int,) or values 
(2,Aplicação de Cal,FFFFFF,[Id: 1, Name: Plantio],null,). Cause: java.lang.IllegalArgumentException

正如上面的堆栈跟踪所建议的那样,即使应用了处理程序,我仍然得到一个null值而不是。0

我尝试但没有成功的解决方案

1.使用处理程序的完全限定名称而不是 resultmap 上的别名:

<arg column="activity.id_client" javaType="_int" typeHandler="org.apache.ibatis.type.IntegerTypeHandler"/>

2.添加类型处理程序声明mybatis-config.xml

<typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.IntegerTypeHandler"/>
</typeHandlers>

有任何想法吗?提前致谢!

4

1 回答 1

0

你得到异常是因为你试图使用 Mybatis 的默认值IntegerTypeHandler,它不支持空值(源代码)。

为了满足您的要求,您需要实现自定义 typeHandler,它将继承自 default IntegerTypeHandler

在这里,您将找到实现您自己的 typeHandler 所需的所有信息。

如果你不知道从哪里开始使用你自己的 typeHandler: 这个类几乎正是你想要的。查看其界面可以清楚地表明:

  • 你应该扩展默认值org.apache.ibatis.type.IntegerTypeHandler

  • 在您的实现中,这两种getResult()方法都应该被覆盖

于 2013-10-15T22:03:25.943 回答