web-dev-qa-db-ja.com

Spring Boot @autowiredは機能しません、異なるパッケージのクラス

Springブートアプリケーションがあります。

次のエラーが表示されます

org.springframework.beans.factory.BeanCreationException: 'birthdayController'という名前のBeanの作成エラー:自動配線された依存関係の挿入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationException:フィールドを自動配線できませんでした:private com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository;ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:依存関係のタイプ[com.esri.birthdays.dao.BirthdayRepository]の修飾Beanが見つかりません:この依存関係の自動配線候補として修飾される少なくとも1つのBeanが必要です。依存アノテーション:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:334)〜[spring-beans-4.2 .4.RELEASE.jar:4.2.4.RELEASE] org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1214)〜[spring-beans-4.2.4.RELEASE.jar:4.2。 4.RELEASE] org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:543)〜[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework。 beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:482)〜[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] org.springframework.beans.factory.support.AbstractBeanFactory $ 1で。 getObject(AbstractBeanFactory.Java:306)〜[spring-beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE]または

以下は私のリポジトリクラスのコードです

package com.esri.birthdays.dao;
import com.esri.birthdays.model.BirthDay;
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
    public BirthDay findByFirstName(String firstName);
}

以下はコントローラーです。

package com.esri.birthdays.controller;
@RestController
public class BirthdayController {

    @Autowired
    private BirthdayRepository repository;

同じパッケージ内にある場合は動作します。理由がわからない

21
Aniket Patil

たとえばパッケージで@SpringBootApplicationアノテーションを使用する場合

com.company.config

次のようにコンポーネントを自動的にスキャンします。

@ComponentScan("com.company.config") 

そのため、com.company.controllerなどのパッケージはスキャンしません。そのため、通常のパッケージの1レベル前に@SpringBootApplicationをパッケージで宣言する必要があります。com.companyOR use scanBasePackagesプロパティ、このような:

@SpringBootApplication(scanBasePackages = { "com.company" })

またはcomponentScan:

@SpringBootApplication
@ComponentScan("com.company")


59
jgr

パッケージを@SpringBootApplicationタグ内に置くだけです。

@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})

お知らせ下さい。

4
LucaT

@ComponentScan("com.esri.birthdays")注釈を使用して、構成クラスに注釈を付けてみてください。一般的に、プロジェクトにサブパッケージがある場合、project-rootで関連するクラスをスキャンする必要があります。あなたの場合は「com.esri.birthdays」になると思います。プロジェクトにサブパッケージがない場合は、ComponentScanは必要ありません。

3
mchlfchr

この種の問題については、新しく作成されたサービスクラスに@Serviceアノテーションを付けることになり、その後自動配線が選択されました。そのため、対応する必要な注釈(@Controller@Serviceなど)を適用する必要がある場合は、自動配線されていないクラスをチェックしてから、プロジェクトのビルドを再試行してください。

2
Sreeni

Spring Bootは、@ SpringBootApplicationクラスの同じパッケージ(またはサブパッケージ)に含まれている限り、これらのリポジトリを自動的に処理します。登録プロセスをさらに制御するには、@ EnableMongoRepositoriesアノテーションを使用できます。 spring.ioガイド

@SpringBootApplication
@EnableMongoRepositories(basePackages = {"RepositoryPackage"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
2
sasanka

私の場合、new <classname>()を使用してそのクラスインスタンスを初期化したため、@componentは機能していませんでした。

コードの任意の場所で従来のJava方法でインスタンスを初期化すると、springはそのコンポーネントをIOCコンテナに追加しません。

1
Nikhil Kakade

これを試して:

    @Repository
    @Qualifier("birthdayRepository")
    public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
        public BirthDay findByFirstName(String firstName);
    }

そして、Beanを注入するとき:

    @Autowired
    @Qualifier("birthdayRepository")
    private BirthdayRepository repository;

そうでない場合は、設定でCoponentScanを確認してください。

0
Gemasoft

同じ問題がありました。 Autowiredオブジェクトからprivate修飾子を削除すると、うまくいきました。

0
Prerit Jain

誕生日に関連するフィールドも含むBeanが必ず存在するため、これを使用すると問題が解決します

@SpringBootApplication
@EntityScan("com.Java.model*")  // base package where bean is present
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
0
gurman singh