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

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

ただいまの
回答率

90.84%

  • Spring Boot

    420questions

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

Spring Bootのマルチモジュール構成で、別モジュールにある依存クラスが@Autowiredできない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 656

AIUeno

score 5

親パッケージ、子モジュール☓2の構成でプロジェクトを作っています。

ディレクトリ構成は以下になります。

Package ←親プロジェクト
├── admin ←子モジュール
│  ├── pom.xml
│  └── src
│     └── main
│        └── java
│           └── admin
│              ├── AdminApplication.java
│              ├── WebSecurityConfig.java
│              ├── app
│              │  └── MainController.java
│              ├── component
│              └── domain
│                     ├── model
│                     ├── repository
│                     └── service
├── web ←子モジュール
│        ├── pom.xml
│        ├── src
│        ├── main
│        ├── java
│                 └── web
│                          ├── WebApplication.java
│                          ├── WebSecurityConfig.java
│                          ├── app
│                          │      └── WebMainController.java
│                          └── service

※親パッケージを作ったのは、2つのプロジェクトで
DBが共通のため、子モジュールのwebでは、admin.domain以下を使いたかったためです。

Webモジュールの
WebApplication.java

package web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = {"web", "admin.domain"})
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);

    }

}

eclipseでwebモジュールを起動しようとすると、
以下エラーが出て起動できませんでした。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'admin.domain.repository.customer.CustomerRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]

.... 略

  2018-01-08 12:19:26.610 ERROR 17257 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

  ***************************
  APPLICATION FAILED TO START
  ***************************

  Description:

  Field customerRepository in web.domain.service.customer.AuthCustomerDetailsService required a bean of type 'admin.domain.repository.customer.CustomerRepository' that could not be found.


  Action:

  Consider defining a bean of type 'admin.domain.repository.customer.CustomerRepository' in your configuration.

子モジュールWebのAuthCustomerDetailsService.java

  package web.domain.service.customer;

  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.security.core.userdetails.UserDetails;
  import org.springframework.security.core.userdetails.UserDetailsService;
  import org.springframework.security.core.userdetails.UsernameNotFoundException;
  import org.springframework.stereotype.Component;

  import admin.domain.model.PtCustomer;
  import admin.domain.repository.customer.CustomerRepository;


  @Component
  public class AuthCustomerDetailsService implements UserDetailsService {

      @Autowired
      CustomerRepository customerRepository;

      @Override
      public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

          PtCustomer customer = customerRepository.findByCode(username);
          if(customer == null){
              throw new UsernameNotFoundException(username + " is not found.");
          }

          return new AuthCustomerDetails(customer);
      }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

WEB,ADMIN,PACKAGEの関係的に

PACKAGE には module で WEB,ADMIN を定義し
WEB には parent で PACKAGE を定義し dependency で ADMIN を定義し
ADMIN には parent で PACKAGE を定義し

すべてにおいてmvn インストールがすんでいないからかもね

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 09:31

    回答ありがとうございます!
    module と parentの設定はしていましたが、dependencyの設定はしていませんでした。
    pom.xmlへの記述の仕方がわかりません。

    キャンセル

  • 2018/01/09 09:33

    (追記)こちらに記述がありました。
    https://qiita.com/rubytomato@github/items/118817023845b4284553

    すいません、試してみます。

    キャンセル

  • 2018/01/09 09:37

    pom.xmlの修正、および全てのモジュールでmvnインストールを実行してみましたが、
    状況は変わりませんでした。

    キャンセル

check解決した方法

0

mainのクラスに@componentscan を記述することで、上記のエラーは発生しなくなりました。

WebApplication.java

package web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@ComponentScan(basePackages = {"web", "admin"})
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);

    }

@ComponentScan(basePackages = {"web", "admin.domain"})
として、DBがらみの必要なところだけ読み込みたかったのですが、これだとエラーが解消せず。
"admin"で丸ごと指定するとエラーがでなくなりました。

しかし、この状態だと、管理側ログインとWeb側ログインのWebSecurityConfigがバッティングして
意図した動作になりません。

excludeFilters=でadmin側のWebSecurityConfigを読み込まないよう除外したいのですが、
また別の現象なので、新しく質問を起こすことにします。
ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 12:27

    Spring Boot で複数のログイン画面を使う
    http://d.hatena.ne.jp/hagi44/20151210/1449750076

    でどうにかなりそうなきもしないでもないが

    WEB,ADMIN,ADMIN-DOMAIN の3分割にしたらいいきがするが・・・(もしくは Package に ドメインを移植)

    キャンセル

  • 2018/01/09 12:28

    ほかの JAR の中を検索するときは componentscan は必須

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Spring Boot

    420questions

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