ひろぽんのブログ

自然とコーヒーが好きです。日々感じたことをそのまま書きます。

Spring Boot (java.lang.IllegalArgumentException: argument type mismatch)でのエラー

はじめに

Spring Boot + DDD + MyBatis +H2 という構成でDDDサンプルアプリケーションを書いていたのですが 以下のエラーでドハマリしたのでメモ

エラー内容

java.lang.IllegalArgumentException: argument type mismatch
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
    at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:73) ~[mybatis-3.5.13.jar:3.5.13]
    at org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:53) ~[mybatis-3.5.13.jar:3.5.13]
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyConstructorAutomapping(DefaultResultSetHandler.java:774) ~[mybatis-3.5.13

結論

ドメイン層のエンティティを作る際のアノテーションの設定不備でした。 具体的には、以下3つのクラスを作っていますが、今回問題があったのはUserクラス ・EmailをもつvalueObjectクラス ・NameをもつvaluObjectクラス ・Email,NameオブジェクトをもつUserクラス

以下にUserクラスのよくないパターンを記載します。
【修正前】

package com.user.userapi.domain;

import lombok.Value;

@Value
public class User {

    Email email;
    Name name;
}

【修正後】

import lombok.Data;

@Data
public class User {

    Email email;
    Name name;
}

ValueアノテーションではSetterが存在しないため、このUserクラスへ処理でデータが入る場合には要注意です。 私の場合は、mybatisでselect文を発行したあとにこのUserクラスに戻りデータをSetするところがあったため上記のエラーが発生していました。

だいたい、こういったエラーは凡ミスですね・・・

同じような境遇の方の参考になれば幸いです。

ありがとうございました。