質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

15743閲覧

Spring Bootのマルチプロジェクトで@ComponentScanにより参照先プロジェクトにある依存クラスを@Autowiredしようとすると 参照元クラスのbeanも生成されなくなる

4321bocya

総合スコア13

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

0クリップ

投稿2019/02/28 15:50

編集2019/03/01 02:51

※初めて質問します。よろしくお願いいたします。

実現したいこと

現在、Spring Bootのマルチプロジェクトを作成しており、参照元のプロジェクトの中で
参照先の別モジュールにある依存クラスを@Autowiredしたいです。

現在、発生している問題(概要)

@ComponentScanにより参照先プロジェクトにある依存クラスを@Autowiredしようとした際に
参照元クラスのbeanも生成されなくなります。
具体的には@RestControllerアノテーションをつけたContorollerです。

前提

フォルダ構成は以下のパッケージエクスプローラーの通りです。
sample-appがcommon-businessを参照しているという関係性です。
イメージ説明

現在、発生している問題(詳細)

sample-app/build.gradleにcommon-businessへの参照設定を追記してマルチプロジェクトとし、
sample-appのmainクラスにて@ComponentScanを付与したところsample-appのBean自体が生成されなくなりました。
具体的には以下のControllerで@ComponentScanをはずすとBeanがうまく生成され、localhost:8080/sample/api/testへのアクセスも成功します。

java

1package spring.demo.controller; 2import spring.common.demo.ItemService; 3@RestController 4public class ItemController { 5 @Autowired 6 ItemService itemService; 7 8 @GetMapping("/sample/api/test") 9 public String test() { 10 return "Hello World"; 11 } 12}

sample-appからcommon-businessを参照するビルドスクリプトが悪いのか、
別モジュールにある依存クラスへの参照設定が悪いのか
それともその他の部分に問題があるのかわかりません。

お手数をおかけしますが、原因部分とその対応策のご教示をお願い致します。

該当のソースコード

sample-appのbuild.gradle及びsetting.gradleは以下の通りです。
/sample-app/build.gradle

gradle

1buildscript { 2 ext { 3 springBootVersion = '2.1.3.RELEASE' 4 } 5} 6plugins { 7 id 'org.springframework.boot' version '2.1.3.RELEASE' 8 id 'java' 9} 10apply plugin: 'io.spring.dependency-management' 11group = 'spring.demp' 12version = '0.0.1-SNAPSHOT' 13sourceCompatibility = '1.8' 14 15repositories { 16 mavenCentral() 17} 18 19subprojects { 20 apply plugin: "java" 21 apply plugin: "io.spring.dependency-management" 22 23 repositories { 24 mavenCentral() 25 } 26 dependencyManagement { 27 imports { 28 mavenBom "org.springframework.boot:spring-boot-dependencies:$springBootVersion" 29 } 30 } 31} 32 33dependencies { 34 compile project(':common-business') 35 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 36 implementation 'org.springframework.boot:spring-boot-starter-jdbc' 37 implementation 'org.springframework.boot:spring-boot-starter-web' 38 compileOnly 'org.projectlombok:lombok' 39 runtimeOnly 'org.postgresql:postgresql' 40 testImplementation 'org.springframework.boot:spring-boot-starter-test' 41} 42

/sample-app/setting.gradle

gradle

1 2rootProject.name = 'sample-app' 3 4include ':common-business' 5project(':common-business').projectDir = new File('../common-business')

/common-business/build.gradle

gradle

1 2plugins { 3 id 'java' 4} 5 6repositories { 7 mavenCentral() 8} 9 10dependencies { 11 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 12 implementation 'org.springframework.boot:spring-boot-starter-jdbc' 13 implementation 'org.springframework.boot:spring-boot-starter-web' 14 compileOnly 'org.projectlombok:lombok' 15 runtimeOnly 'org.postgresql:postgresql' 16 testImplementation 'org.springframework.boot:spring-boot-starter-test' 17 18 // Use JUnit test framework 19 testImplementation 'junit:junit:4.12' 20} 21

試したこと

別モジュールにある依存クラスを@Autowiredするために@ComponentScan("common-business")としています。

補足情報(FW/ツールのバージョンなど)

Spring Boot 2.1.3
Gradle 4.10.2

ptiringo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ソースコードを拝見する限り、@ComponentScan("common-business") を付与したことにより、コンポーネントである ItemController が bean として登録されなくなったためだと思われます。

@ComponentScan に指定する文字列は、コンポーネントスキャンを行うパッケージ(例: "spring.demo.controller")です。ここに "common-business" が指定されたので、common-business パッケージ配下がコンポーネントスキャンの対象となっています。実際に登録したいコンポーネントが存在するのは ItemController が位置する spring.demo.controller と ItemService が位置する spring.common.demo なので、それらを指定してあげる必要があります。

java

1@ComponentScan({ "spring.demo.controller", "spring.common.demo" }) 2@SpringBootApplication 3public class Sample Application { 4 // 省略 5}

なお、@SpringBootApplication@ComponentScan を包含しており、このアノテーションが付与されたクラスが存在するパッケージとその配下のパッケージをコンポーネントスキャンの対象とします(@ComponentScan アノテーションを付与する前に ItemController が正常に動作していたのは、ItemController クラスが @SpringBootApplication アノテーションを付与したクラスが存在するパッケージの配下のパッケージに存在したため)。@SpringBootApplication アノテーションでもコンポーネントスキャン対象のパッケージを指定することが可能です。

java

1@SpringBootApplication(scanBasePackages = { "spring.demo.controller", "spring.common.demo" }) 2public class Sample Application { 3 // 省略 4}

投稿2019/03/04 13:29

ptiringo

総合スコア104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

4321bocya

2019/03/05 01:54

お返事が遅くなり、申し訳ございません。 上記の対応をした結果、問題が解決しました。 ありがとうございました。
guest

0

参照しているプロジェクトを含めたことで 404 (FileNotFound) になっているのであれば、インポートしているプロジェクトそのもの、もしくは依存関係で示しているモジュールの設定が不足していて、Webアプリケーションが起動していないのではないでしょうか。

ビルドエラーや、SpringBootを起動しなおしたときに何らかのエラーは出ているかと思いますが、現状の設定だけ書かれている状態ではこれ以上のことはわかりません。

投稿2019/02/28 16:11

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

4321bocya

2019/02/28 23:14

コメントありがとうございます。 参照先のプロジェクトのbuild.gradleを質問文に追記しました。 またビルドエラーやSpring Bootの起動時のエラーは起きていません。
rubytomato

2019/03/01 12:42

ページにアクセスして404エラーが出たときにもエラーは出力されていないのでしょうか?
A-pZ

2019/03/01 23:46

common-business側の設定で`@ComponentScan`ないしはそれに代替される設定がすでになされており、common-businessの`@ComponentScan`パッケージ対象とことなるパッケージならば、Controllerとして生成されません。 なお、Controllerに`@ComponentScan`はつけずに、通常は起動クラスにつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問