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;
同じパッケージ内にある場合は動作します。理由がわからない
たとえばパッケージで@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")
パッケージを@SpringBootApplicationタグ内に置くだけです。
@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})
お知らせ下さい。
@ComponentScan("com.esri.birthdays")
注釈を使用して、構成クラスに注釈を付けてみてください。一般的に、プロジェクトにサブパッケージがある場合、project-rootで関連するクラスをスキャンする必要があります。あなたの場合は「com.esri.birthdays」になると思います。プロジェクトにサブパッケージがない場合は、ComponentScanは必要ありません。
この種の問題については、新しく作成されたサービスクラスに@Service
アノテーションを付けることになり、その後自動配線が選択されました。そのため、対応する必要な注釈(@Controller
、@Service
など)を適用する必要がある場合は、自動配線されていないクラスをチェックしてから、プロジェクトのビルドを再試行してください。
Spring Bootは、@ SpringBootApplicationクラスの同じパッケージ(またはサブパッケージ)に含まれている限り、これらのリポジトリを自動的に処理します。登録プロセスをさらに制御するには、@ EnableMongoRepositoriesアノテーションを使用できます。 spring.ioガイド
@SpringBootApplication
@EnableMongoRepositories(basePackages = {"RepositoryPackage"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
私の場合、new <classname>()
を使用してそのクラスインスタンスを初期化したため、@component
は機能していませんでした。
コードの任意の場所で従来のJava方法でインスタンスを初期化すると、springはそのコンポーネントをIOCコンテナに追加しません。
これを試して:
@Repository
@Qualifier("birthdayRepository")
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
そして、Beanを注入するとき:
@Autowired
@Qualifier("birthdayRepository")
private BirthdayRepository repository;
そうでない場合は、設定でCoponentScanを確認してください。
同じ問題がありました。 Autowiredオブジェクトからprivate修飾子を削除すると、うまくいきました。
誕生日に関連するフィールドも含む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);
}
}