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するところがあったため上記のエラーが発生していました。
だいたい、こういったエラーは凡ミスですね・・・
同じような境遇の方の参考になれば幸いです。
ありがとうございました。