2015-12-19 13 views
10

私はSpringブートアプリケーションを持っています。Spring Boot @autowiredは動作しません。別のクラスのクラス

私は次のようなエラーに

org.springframework.beans.factory.BeanCreationException取得:エラー は、名前のBeanを作成する 'をbirthdayController':autowired 依存性の注入は失敗しました。入れ子になった例外は org.springframework.beans.factory.BeanCreationException:できませんでした autowireフィールド:private com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository;このため autowire候補としての資格が期待少なくとも1豆:依存見つかりタイプ[com.esri.birthdays.dao.BirthdayRepository] ​​ の無修飾ビーン:ネスト 例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionあります依存。依存注釈: {@ org.springframework.beans.factory.annotation.Autowired(必須=真)} 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] at 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.AbstractAutowir eCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 〜[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory。 Javaの:306) 〜[春豆-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; 

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

+0

メインクラスはどのパッケージですか?そのコンポーネントスキャンは、リポジトリパッケージとコントローラパッケージの両方をカバーしていますか? –

答えて

1

設定クラスに@ComponentScan("com.esri.birthdays")アノテーションを付けることを試みてください。 一般的に話す:プロジェクトにサブパッケージがある場合は、プロジェクトルートで関連するクラスをスキャンする必要があります。私はあなたのケースでは "com.esri.birthdays"になると思う。 プロジェクトにサブパッケージがない場合、ComponentScanは必要ありません。

0

はこれを試してみてください:

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

とBean注入:いない場合は

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

を、あなたの設定であなたのCoponentScanをご確認ください。

35

あなたは例のパッケージ

com.company.config

ために@SpringBootApplicationアノテーションを使用する場合、それは自動的にコンポーネントは次のようにスキャンを行います:

@ComponentScan("com.company.config") 

だから、それは意志com.company.controllerなどのようなパッケージをスキャンしないでください。なぜなら、あなたのノーマの前に@SpringBootApplicationをパッケージの1つのレベルで宣言しなければならない理由です

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

OR componentScan:

@SpringBootApplication 
@ComponentScan("com.company") 


2

春ブーツ限り、彼らがそうであるように、自動的にこれらのリポジトリを処理します。このようなcom.companyまたは使用scanBasePackagesプロパティ、このようなLパッケージあなたの@SpringBootApplicationクラスの同じパッケージ(またはサブパッケージ)に含まれています。登録プロセスをより詳細に制御するには、@EnableMongoRepositories注釈を使用できます。 spring.io guides

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

@SpringBootApplicationタグの中にパッケージを入れるだけです。

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

私に知らせてください。

2

このような問題のために、新しく作成されたサービスクラスに@Service注釈を入れてから、オートワイヤーが取り上げられました。 それに対応する必須の注釈(たとえば@Controller,など)が必要な場合は、オートワイヤーされていないクラスをチェックしてから、プロジェクトを再度ビルドしてみてください。

1

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

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

関連する問題