■はじめに
今回話す内容はこちらのSpring解体新書の8章Mybatisのところになります。
今章まで特に詰まることなく進めてきていたのに、ここのエラーで1週間程度詰まってしまったので、もし同事象で悩まれている方がいたらと思ってログを残します。
■達成したいこと
8章の8.2.1 insertにおいてコンパイルエラーなく、アプリケーションが実行できることをゴールとしております。
■詰まった箇所
テキストに従って、pomやsql、Mapperとどんどんファイルを作成していくと思います。
今回そんな中、UserServiceImplクラスでUserMapperを呼び出した段階で以下エラーが発生しました。
エラー内容は以下です。
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'mapper': No qualifying bean of type 'com.example.repository.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.repository.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Springの公式曰く1行目のエラーが、
依存関係チェックが有効になっているにもかかわらず、Bean が他の Bean または Bean ファクトリ定義で指定されていない単純なプロパティに依存している場合にスローされる例外 とのこと。
2行目のエラーが、BeanFactory定義が見つからない Bean インスタンスを が要求されたときにスローされる例外とのこと。。
▶︎参照したSpring公式
要は、アノテーションの設定ミスかな??と思いテキストと照らし合わせてみたものの全く一緒。書き間違いなんてなく、コピペまでしたけど変わらずエラーでした。
■解決方法
こんだけ調べて解決方法がこんなこと??とはなりますが、pom.xmlでMybatisのライブラリのバージョンを上げただけで解決できました。
「■参照サイト」にリンク先の回答者のコメントを見ると、
「Java17ではサポートされていない可能性があることに気づいた!!そこでmybatisのバージョンあげたら問題は解決されたよ〜」みたいなことを書いていたので藁にもすがる思いでコメントを信じ、バージョンを上げてmeven installすると、、あら今までのエラーが嘘のように出なくなりました。
試行錯誤中に、SpringBootApplicationに@MapperScanを付けて明示的にすることで解決するかも??というサイトを見たので試したところ、「■参照サイト」のリンク先で話されてるエラーが出て、ググったらそれっぽいのが見つかって解決に至ったという流れです。
間接的解決なのかなと思いますが、根本解決は今じゃなくていいかな〜と思ったのでスルーしてます。
■反省点
回答者のコメントにあったJava17ではという文言にハッとして、解体新書のJavaバージョンを見たところ8でした。
エラーのQAとかでよく言語のバージョンやライブラリのバージョンを書いているのを見るのに、なんで自分はエラー文言ばかりにとらわれてしまったんだろう、、、と反省しました。。
■参照サイト