web-dev-qa-db-ja.com

Spring Bootで@Repositoryアノテーション付きインターフェイスを自動配線できない

私はスプリングブートアプリケーションを開発していますが、ここで問題に直面しています。 @Repositoryアノテーション付きインターフェイスを挿入しようとしていますが、まったく機能しないようです。このエラーが発生しています

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springBootRunner': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1202)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:755)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:480)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:686)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:957)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:946)
    at com.pharmacy.config.SpringBootRunner.main(SpringBootRunner.Java:25)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:561)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.Java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:331)
    ... 16 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.Java:1301)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.Java:1047)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.Java:942)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:533)
    ... 18 common frames omitted

ここに私のコードがあります:

メインアプリケーションクラス:

package com.pharmacy.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
@ComponentScan("org.pharmacy")
public class SpringBootRunner {


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

エンティティクラス:

package com.pharmacy.persistence.users;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;



@Entity
public class UserEntity {

    @Id
    @GeneratedValue
    private Long id;
    @Column
    private String name;

}

リポジトリインターフェース:

package com.pharmacy.persistence.users.dao;

import com.pharmacy.persistence.users.UserEntity;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface UserEntityDao extends CrudRepository<UserEntity,Long>{

}

コントローラ:

package com.pharmacy.controllers;

import com.pharmacy.persistence.users.UserEntity;
import com.pharmacy.persistence.users.dao.UserEntityDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class HomeController {


    @Autowired
    UserEntityDao userEntityDao;

    @RequestMapping(value = "/")
    public String hello() {
        userEntityDao.save(new UserEntity("ac"));
        return "Test";

    }
}

build.gradle

buildscript {
    ext {
        springBootVersion = '1.2.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'Java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
mainClassName = "com.pharmacy.config.SpringBootRunner"
jar {
    baseName = 'demo'
    version = '0.0.1-SNAPSHOT'
}


repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-ws")
    compile("postgresql:postgresql:9.0-801.jdbc4")

    testCompile("org.springframework.boot:spring-boot-starter-test")
}

application.properties:

spring.view.prefix: /
spring.view.suffix: .html

spring.jpa.database=POSTGRESQL
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update


spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=abc123

私は自分のコードを Accessing data jpa と比較しましたが、このコードの何が問題なのか考えが尽きています。任意の助けに感謝します。前もって感謝します。

編集:上記のようにコードを変更しましたが、@ Repositoryインターフェースを別のコンポーネントに挿入するときにエラーが発生しません。ただし、現在問題があります-コンポーネントを取得できません(デバッグを使用しました)。 Springが私のコンポーネントを見つけることができないように私が間違っているのは何ですか?

50
visst

リポジトリパッケージが@SpringBootApplication/@EnableAutoConfigurationと異なる場合、@EnableJpaRepositoriesの基本パッケージを明示的に定義する必要があります。

SpringBootRunnerに@EnableJpaRepositories("com.pharmacy.persistence.users.dao")を追加してみてください

118
hang321

リポジトリが見つからないという同じ問題がありました。それで、私がしたことは、すべてを1つのパッケージに移動することでした。そしてこれはうまくいきました。つまり、私のコードには何の問題もありませんでした。 Repos&Entitiesを別のパッケージに移動し、SpringApplicationクラスに次を追加しました。

@EnableJpaRepositories("com...jpa")
@EntityScan("com...jpa")

その後、サービス(インターフェイスと実装)を別のパッケージに移動し、SpringApplicationクラスに次を追加しました。

@ComponentScan("com...service")

これで問題が解決しました。

24
Sanjay Mistry

このタイプの問題には別の原因があります。私はしばらくの間この問題に苦労しており、SOで答えを見つけることができなかったためです。

次のようなリポジトリ内:

@Repository
public interface UserEntityDao extends CrudRepository<UserEntity, Long>{

}

エンティティUserEntityにクラスの@Entity注釈がない場合、同じエラーが発生します。

このエラーは、Springに関する問題を解決しようとすることに集中しているため、リポジトリが見つからないがエンティティが問題であるため、この場合は混乱を招きます。リポジトリをテストしようとしてこの回答に至った場合は、 この回答 が役に立つかもしれません。

14
Dherik

@ComponentScan注釈が正しく設定されていないようです。試してください:

@ComponentScan(basePackages = {"com.pharmacy"})

com.pharmacyパッケージの直下など、構造の最上部にメインクラスがある場合、実際にはコンポーネントスキャンは必要ありません。

また、両方は必要ありません

@SpringBootApplication
@EnableAutoConfiguration

@SpringBootApplication注釈には、デフォルトで@EnableAutoConfigurationが含まれます。

12
Damien Polegato

私はSpring BootでNoSuchBeanDefinitionExceptionを受け取っていた(基本的にCRUDリポジトリで作業中)同様の問題があり、メインクラスに以下の注釈を付ける必要がありました:

@SpringBootApplication   
@EnableAutoConfiguration
@ComponentScan(basePackages={"<base package name>"})
@EnableJpaRepositories(basePackages="<repository package name>")
@EnableTransactionManagement
@EntityScan(basePackages="<entity package name>")

また、実装に@Component注釈が配置されていることを確認してください。

11
Vinayak Shenoy

上記の答えに拡張するには、EnableJPARepositoriesタグに実際に複数のパッケージを追加して、リポジトリパッケージを指定しただけで「Object not mapped」エラーが発生しないようにすることができます。

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"})
public class SpringBootApplication{

}
3
yogidilip

ここに間違いがあります:前に誰かが言ったように、com.pharmacyをinstedしたorg.pharmacyをcomponentscanで使用しています

    package **com**.pharmacy.config;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;


    @SpringBootApplication
    @ComponentScan("**org**.pharmacy")
    public class SpringBootRunner {
2
Bence

私もこのトピックに関していくつかの問題を抱えていました。次の例のように、Springブートランナークラスでパッケージを定義する必要があります。

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
public class Application {

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

これがお役に立てば幸いです!

1

私は同様の問題を抱えていましたが、原因は異なります:

私の場合、問題はリポジトリを定義するインターフェースにありました

public interface ItemRepository extends Repository {..}

テンプレートのタイプを省略していました。それらを正しく設定する:

public interface ItemRepository extends Repository<Item,Long> {..}

トリックをしました。

1
Antoni

間違ったパッケージをスキャンしています:@ComponentScan( "org。pharmacy")

あるべき場所:@ComponentScan( "com。pharmacy")

パッケージ名はorgではなくcomで始まるため。

1
rahsan

@ComponentScan("org.pharmacy")では、org.pharmacyパッケージを宣言しています。しかし、com.pharmacyパッケージ内のコンポーネント。

0
yuen26

@DataJpaTestを使用した単体テスト時にこの問題に直面している場合は、以下の解決策があります。

Springブートは、@Repository@DataJpaTest Beanを初期化しません。したがって、以下の2つの修正プログラムのいずれかを試して、それらを使用可能にしてください。

最初の

代わりに@SpringBootTestを使用してください。ただし、これによりアプリケーションコンテキスト全体が起動します。

2番目(より良いソリューション)

以下のように、必要な特定のリポジトリをインポートします

@DataJpaTest
@Import(MyRepository.class)
public class MyRepositoryTest {

@Autowired
private MyRepository myRepository;
0
Meena Chaudhary

SpringBootでは、デフォルトでJpaRepositoryは自動有効化されません。明示的に追加する必要があります

@EnableJpaRepositories("packages")
@EntityScan("packages")
0
priyank