1

結果マップの 1 つで、パッケージIntegerTypeHandlerからデフォルトを構成しようとしています。org.apache.ibatis.typeMyBatis 3.2.1

次のコンストラクター シグネチャが与えられます。

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

フィールドはオプションであるため、値SQL NULLintwith valueに変換しようとしています。そのため、データベースには値がある可能性があります。0int idOfOwnerClientNULL

anullを のようなプリミティブ型に渡そうとするとint、 anExceptionがスローされます。それを解決するために、 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

IntegerTypeHandlernull 値をサポートしていないMybatis の default を使用しようとしているため、例外が発生します (ソース コード)。

要件を満たすには、 default から継承するカスタム typeHandler を実装する必要がありますIntegerTypeHandler

ここには、独自の typeHandler を実装するために必要なすべての情報があります。

独自の typeHandler をどこから始めればよいかわからない場合: このクラスは、ほぼまさにあなたが望むものです。そのインターフェースを見ると、次のことが明らかになります。

  • デフォルトを拡張する必要がありますorg.apache.ibatis.type.IntegerTypeHandler

  • 実装では、両方のgetResult()メソッドをオーバーライドする必要があります

于 2013-10-15T22:03:25.943 に答える