Spring Bootのマルチプロジェクトの構成で疑問があり質問させてください。
まず、プロジェクトのディレクトリ構造は以下のようになっており、
ドメインモジュールとアプリケーションモジュールから構成されています。
example(親プロジェクト)
├── pom.xml
├── core(ドメインモジュール)
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── jp.co.example.core
│ ├── config
│ └── MybatisConfig.java
│ ├── entity
│ └── User.java
│ ├── mapper
│ │ └── UserMapper.java
│ ├── repository
│ └── UserRepository.java
│ └── service
│ └── UserService.java
├── application(アプリケーションモジュール)
│ ├── pom.xml
│ ├── src
│ └── main
│ └── java
│ └── jp.co.example.application
│ ├── Controller
│ └── ExampleApplication.java
coreモジュールのUserMapper.javaはMybatisで実装しており、
UserRepository.javaでAutowiredしています。
また、@Mapperのアノテーションを付与しています。
Java
1package jp.co.example.core.mapper; 2 3import java.util.List; 4 5import org.apache.ibatis.annotations.Mapper; 6import org.apache.ibatis.annotations.Param; 7 8import jp.co.example.core.entity.User; 9 10@Mapper 11public interface UserMapper { 12 int insert(User record); 13 14 List<User> selectAll(); 15 16 User selectByUserNo(@Param("userNo") long userNo); 17}
Applicationモジュールのメインクラスは以下の通りです。
Java
1package jp.co.example.application; 2 3import org.springframework.boot.SpringApplication; 4import org.springframework.boot.autoconfigure.SpringBootApplication; 5 6@SpringBootApplication(scanBasePackages = {"jp.co.example.application", "jp.co.example.core"}) 7public class ExampleApplication { 8 9 public static void main(String[] args) { 10 SpringApplication.run(ExampleApplication.class,args); 11 } 12 13}
Mavenビルド後、ApplicationモジュールをRunすると以下のエラーで起動ができませんでした。
Description: Parameter 0 of constructor in jp.co.example.core.repository.UserRepository required a bean of type 'jp.co.example.core.mapper.UserMapper' that could not be found. Action: Consider defining a bean of type 'jp.co.example.core.mapper.UserMapper' in your configuration.
上記のエラーについて、以下のようにメインクラスにて@MapperScanでパッケージ指定してみると動作することが確認できました。
Java
1package jp.co.example.application; 2 3import org.springframework.boot.SpringApplication; 4import org.springframework.boot.autoconfigure.SpringBootApplication; 5 6@SpringBootApplication(scanBasePackages = {"jp.co.example.application", "jp.co.example.core"}) 7@MapperScan("jp.co.example.core.mapper") 8public class ExampleApplication { 9 10 public static void main(String[] args) { 11 SpringApplication.run(ExampleApplication.class,args); 12 } 13 14}
しかし、@ComponentScanによるパッケージ指定とは別に@MapperScanが必要なのはなぜでしょうか?
別モジュールのBeanを参照する場合、@ComponentScanによるパッケージ指定が必要と理解しています。
coreモジュールのマッパーに@Mapperが付与されていれば勝手に読み込んでくれるものと
思っていたのですが認識が間違っていますでしょうか?
あなたの回答
tips
プレビュー