Ich entwickle eine Spring Boot-Anwendung und stoße hier auf ein Problem. Ich versuche, eine mit @Repository-Annotationen versehene Schnittstelle einzufügen, und es scheint überhaupt nicht zu funktionieren. Ich erhalte diesen Fehler
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
Hier ist mein Code:
Hauptanwendungsklasse:
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);
}
}
Entitätsklasse:
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;
}
Repository-Schnittstelle:
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>{
}
Regler:
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
Ich habe meinen Code sogar mit Zugriff auf Daten jpa verglichen, und mir gehen die Ideen aus, was an diesem Code falsch ist. Jede Hilfe dankbar. Danke im Voraus.
BEARBEITET: Ich habe meinen Code wie oben vorgeschlagen geändert und erhalte diesen Fehler nicht, wenn ich meine @ Repository-Schnittstelle in eine andere Komponente einspeise. Jetzt habe ich jedoch ein Problem - meine Komponente kann nicht abgerufen werden (ich habe das Debuggen verwendet). Was mache ich falsch, damit der Frühling meine Komponente nicht findet?
Wenn sich das Repository-Paket von @SpringBootApplication
/@EnableAutoConfiguration
Unterscheidet, muss das Basispaket von @EnableJpaRepositories
Explizit definiert werden.
Versuchen Sie, SpringBootRunner @EnableJpaRepositories("com.pharmacy.persistence.users.dao")
hinzuzufügen
Ich hatte die gleichen Probleme mit Repository nicht gefunden. Also habe ich alles in ein Paket verschoben. Und das hat funktioniert, was bedeutet, dass an meinem Code nichts falsch war. Ich habe die Repos & Entities in ein anderes Paket verschoben und Folgendes zur SpringApplication-Klasse hinzugefügt.
@EnableJpaRepositories("com...jpa")
@EntityScan("com...jpa")
Danach habe ich den Service (Schnittstelle & Implementierung) in ein anderes Paket verschoben und Folgendes zur SpringApplication-Klasse hinzugefügt.
@ComponentScan("com...service")
Dies löste meine Probleme.
Es gibt eine andere Ursache für diese Art von Problem, die ich mitteilen möchte, da ich einige Zeit mit diesem Problem zu kämpfen habe und auf SO keine Antwort finden konnte.
In einem Repository wie:
@Repository
public interface UserEntityDao extends CrudRepository<UserEntity, Long>{
}
Wenn Ihre Entität UserEntity
nicht über das @Entity
Anmerkung zur Klasse, Sie haben den gleichen Fehler.
Dieser Fehler ist in diesem Fall verwirrend, da Sie sich darauf konzentrieren, das Problem zu beheben, dass Spring das Repository nicht gefunden hat, das Problem jedoch die Entität ist. Und wenn Sie zu dieser Antwort gekommen sind, um Ihr Repository zu testen, kann diese Antwort Ihnen helfen.
Es scheint dein @ComponentScan
Anmerkung ist nicht richtig eingestellt. Versuchen :
@ComponentScan(basePackages = {"com.pharmacy"})
Eigentlich brauchen Sie den Komponentenscan nicht, wenn Sie Ihre Hauptklasse ganz oben in der Struktur haben, zum Beispiel direkt unter com.pharmacy
Paket.
Sie brauchen auch nicht beides
@SpringBootApplication
@EnableAutoConfiguration
Das @SpringBootApplication
Anmerkung enthält @EnableAutoConfiguration
standardmäßig.
Ich hatte ein ähnliches Problem, bei dem ich NoSuchBeanDefinitionException
in Spring Boot erhielt (im Grunde genommen, während ich am CRUD-Repository arbeitete), ich musste die folgenden Anmerkungen für die Hauptklasse einfügen:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages={"<base package name>"})
@EnableJpaRepositories(basePackages="<repository package name>")
@EnableTransactionManagement
@EntityScan(basePackages="<entity package name>")
Stellen Sie außerdem sicher, dass Sie das @Component
vorhandene Anmerkungen zu den Implementierungen.
Um die obigen Antworten zu erweitern, können Sie Ihrem EnableJPARepositories-Tag tatsächlich mehr als ein Paket hinzufügen, sodass Sie nicht auf den Fehler "Objekt nicht zugeordnet" stoßen, nachdem Sie nur das Repository-Paket angegeben haben.
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"})
public class SpringBootApplication{
}
Hier ist der Fehler: Wie bereits erwähnt, verwenden Sie org.pharmacy anstelle von com.pharmacy in 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 {
Ich hatte auch einige Probleme mit diesem Thema. Sie müssen sicherstellen, dass Sie die Pakete in der Spring-Boot-Runner-Klasse wie im folgenden Beispiel definieren:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
Ich hoffe das hilft!
Ich hatte ein ähnliches Problem, aber mit einer anderen Ursache:
In meinem Fall war das Problem, dass in der Schnittstelle das Repository definiert
public interface ItemRepository extends Repository {..}
Ich habe die Typen der Vorlage weggelassen. Richtig stellen:
public interface ItemRepository extends Repository<Item,Long> {..}
hat den Trick gemacht.
Sie scannen das falsche Paket: @ComponentScan ("org. Pharmacy")
Wo sollte es sein: @ComponentScan ("com. Pharmacy")
Da Ihre Paketnamen mit com und nicht org beginnen.
In @ComponentScan("org.pharmacy")
deklarieren Sie org.pharmacy
Paket. Aber deine Komponenten in com.pharmacy
Paket.
Wenn Sie beim Unit-Test mit @DataJpaTest
Auf dieses Problem stoßen, finden Sie unten die Lösung.
Spring Boot initialisiert keine @Repository
- Beans für @DataJpaTest
. Probieren Sie eine der beiden unten aufgeführten Lösungen aus, um sie verfügbar zu machen:
Erste
Verwenden Sie stattdessen @SpringBootTest
. Dadurch wird jedoch der gesamte Anwendungskontext gestartet.
Zweite (Bessere Lösungen)
Importieren Sie das gewünschte Repository (siehe unten)
@DataJpaTest
@Import(MyRepository.class)
public class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
In SpringBoot wird das JpaRepository standardmäßig nicht automatisch aktiviert. Sie müssen explizit hinzufügen
@EnableJpaRepositories("packages")
@EntityScan("packages")