wake-up-neo.com

Mit @Repository-Annotationen versehene Schnittstelle in Spring Boot kann nicht automatisch verkabelt werden

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?

50
visst

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

118
hang321

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.

24
Sanjay Mistry

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.

14
Dherik

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.

12
Damien Polegato

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.

11
Vinayak Shenoy

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{

}
3
yogidilip

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 {
2
Bence

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!

1

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.

1
Antoni

Sie scannen das falsche Paket: @ComponentScan ("org. Pharmacy")

Wo sollte es sein: @ComponentScan ("com. Pharmacy")

Da Ihre Paketnamen mit com und nicht org beginnen.

1
rahsan

In @ComponentScan("org.pharmacy") deklarieren Sie org.pharmacy Paket. Aber deine Komponenten in com.pharmacy Paket.

0
yuen26

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;
0
Meena Chaudhary

In SpringBoot wird das JpaRepository standardmäßig nicht automatisch aktiviert. Sie müssen explizit hinzufügen

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