私はスプリングブートアプリケーションを開発していますが、ここで問題に直面しています。 @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が私のコンポーネントを見つけることができないように私が間違っているのは何ですか?
リポジトリパッケージが@SpringBootApplication
/@EnableAutoConfiguration
と異なる場合、@EnableJpaRepositories
の基本パッケージを明示的に定義する必要があります。
SpringBootRunnerに@EnableJpaRepositories("com.pharmacy.persistence.users.dao")
を追加してみてください
リポジトリが見つからないという同じ問題がありました。それで、私がしたことは、すべてを1つのパッケージに移動することでした。そしてこれはうまくいきました。つまり、私のコードには何の問題もありませんでした。 Repos&Entitiesを別のパッケージに移動し、SpringApplicationクラスに次を追加しました。
@EnableJpaRepositories("com...jpa")
@EntityScan("com...jpa")
その後、サービス(インターフェイスと実装)を別のパッケージに移動し、SpringApplicationクラスに次を追加しました。
@ComponentScan("com...service")
これで問題が解決しました。
このタイプの問題には別の原因があります。私はしばらくの間この問題に苦労しており、SOで答えを見つけることができなかったためです。
次のようなリポジトリ内:
@Repository
public interface UserEntityDao extends CrudRepository<UserEntity, Long>{
}
エンティティUserEntity
にクラスの@Entity
注釈がない場合、同じエラーが発生します。
このエラーは、Springに関する問題を解決しようとすることに集中しているため、リポジトリが見つからないがエンティティが問題であるため、この場合は混乱を招きます。リポジトリをテストしようとしてこの回答に至った場合は、 この回答 が役に立つかもしれません。
@ComponentScan
注釈が正しく設定されていないようです。試してください:
@ComponentScan(basePackages = {"com.pharmacy"})
com.pharmacy
パッケージの直下など、構造の最上部にメインクラスがある場合、実際にはコンポーネントスキャンは必要ありません。
また、両方は必要ありません
@SpringBootApplication
@EnableAutoConfiguration
@SpringBootApplication
注釈には、デフォルトで@EnableAutoConfiguration
が含まれます。
私はSpring BootでNoSuchBeanDefinitionException
を受け取っていた(基本的にCRUDリポジトリで作業中)同様の問題があり、メインクラスに以下の注釈を付ける必要がありました:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages={"<base package name>"})
@EnableJpaRepositories(basePackages="<repository package name>")
@EnableTransactionManagement
@EntityScan(basePackages="<entity package name>")
また、実装に@Component
注釈が配置されていることを確認してください。
上記の答えに拡張するには、EnableJPARepositoriesタグに実際に複数のパッケージを追加して、リポジトリパッケージを指定しただけで「Object not mapped」エラーが発生しないようにすることができます。
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"})
public class SpringBootApplication{
}
ここに間違いがあります:前に誰かが言ったように、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 {
私もこのトピックに関していくつかの問題を抱えていました。次の例のように、Springブートランナークラスでパッケージを定義する必要があります。
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
これがお役に立てば幸いです!
私は同様の問題を抱えていましたが、原因は異なります:
私の場合、問題はリポジトリを定義するインターフェースにありました
public interface ItemRepository extends Repository {..}
テンプレートのタイプを省略していました。それらを正しく設定する:
public interface ItemRepository extends Repository<Item,Long> {..}
トリックをしました。
間違ったパッケージをスキャンしています:@ComponentScan( "org。pharmacy")
あるべき場所:@ComponentScan( "com。pharmacy")
パッケージ名はorgではなくcomで始まるため。
@ComponentScan("org.pharmacy")
では、org.pharmacy
パッケージを宣言しています。しかし、com.pharmacy
パッケージ内のコンポーネント。
@DataJpaTest
を使用した単体テスト時にこの問題に直面している場合は、以下の解決策があります。
Springブートは、@Repository
の@DataJpaTest
Beanを初期化しません。したがって、以下の2つの修正プログラムのいずれかを試して、それらを使用可能にしてください。
最初の
代わりに@SpringBootTest
を使用してください。ただし、これによりアプリケーションコンテキスト全体が起動します。
2番目(より良いソリューション)
以下のように、必要な特定のリポジトリをインポートします
@DataJpaTest
@Import(MyRepository.class)
public class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
SpringBootでは、デフォルトでJpaRepositoryは自動有効化されません。明示的に追加する必要があります
@EnableJpaRepositories("packages")
@EntityScan("packages")