2013-10-15 24 views
0

我試圖從org.apache.ibatis.type封裝的MyBatis 3.2.1結果的一個映射配置默認IntegerTypeHandler的MyBatis - IntegerTypeHandler似乎不工作

考慮下面的構造簽名:

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

我想一個SQL NULL值轉變成int與價值0,因爲該領域int idOfOwnerClient是可選的,因此,該數據庫可以有NULL值。

如果嘗試將null傳遞給原始類型像int,一個Exception將thown,要解決這個問題,我在配置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

解決方案,我試圖沒有成功

使用處理器的全名這一翻譯上的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> 

任何想法?提前致謝!

回答

0

由於您嘗試使用Mybatis的默認IntegerTypeHandler(不支持空值)(source code),您會收到異常。

爲了滿足您的要求,您需要實現自定義的typeHandler,它將繼承默認的IntegerTypeHandler

Here你會發現實現你自己的typeHandler所需的所有信息。

如果你不知道從哪裏開始用自己的類型控制器: This class幾乎正是你想要的。看着它的界面使得它清楚地表明:

  • 你應該在你的實現擴展默認org.apache.ibatis.type.IntegerTypeHandler

  • 你awnser @Michal都getResult()方法應該重寫

+0

感謝。我已經閱讀過'IntegerTypeHandler'類的源代碼,並且根據'getResult'方法的實現,我相信它應該可以工作。 'getResult'調用'ResultSet.getInt(String columnLabel)',它應該返回'null'的'0' intead。請參閱javadoc:http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getInt(java.lang.String)。 –

+0

'IntegerTypeHandler'不重寫'getResult',因此這些方法的基類版本([defined](http://grepcode.com/file/repo1.maven.org/maven2/org.apache.servicemix.bundles/ org.apache.ibatis.type中的org.apache.servicemix.bundles.mybatis/3.0.4_2/org/apache/ibatis/type/BaseTypeHandler.java#BaseTypeHandler.getResult%28java.sql.CallableStatement%2Cint%29)。 BaseTypeHandler')被使用。 –

+0

你是對的,它調用'getNullableResult',然後調用ResultSet.getInt(String columnLabel)''返回'0'爲'null',但它也將'ResultSet.wasNull()'設置爲'true'。 ''ResultSet.wasNull()'在BaseTypeHandler的'getResult'實現中檢查,如果返回'true',則整個方法返回'null'。 –