Подтвердить что ты не робот

Невозможно Autowire @Repository аннотированный интерфейс в Spring Загрузка

Я разрабатываю приложение для загрузки spring, и здесь я сталкиваюсь с проблемой. Я пытаюсь внедрить аннотированный интерфейс @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

Я даже сравнивал свой код с доступом к данным jpa, и у меня заканчивается представление о том, что не так с этим кодом. Любая помощь оценивается. Спасибо заранее.

EDITED: я изменил свой код, как было показано выше, и я не получаю эту ошибку, когда я вставляю свой интерфейс @Repository в другой компонент. Тем не менее, у меня проблема: мой компонент не может быть восстановлен (я использовал отладку). Что я делаю неправильно, поэтому spring не может найти мой компонент?

4b9b3361

Ответ 1

Если пакет репозитория отличается от @SpringBootApplication/@EnableAutoConfiguration, базовый пакет @EnableJpaRepositories должен быть определен явно.

Попробуйте добавить @EnableJpaRepositories("com.pharmacy.persistence.users.dao") в SpringBootRunner

Ответ 2

У меня были те же проблемы с репозиторием, которые не были найдены. Так что я сделал, чтобы переместить все в 1 пакет. И это сработало, что в моем коде не было ничего плохого. Я переместил Repos и Entities в другой пакет и добавил в класс SpringApplication следующее.

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

После этого я переместил Сервис (интерфейс и реализацию) в другой пакет и добавил следующее в класс SpringApplication.

@ComponentScan("com...service")

Это решило мои проблемы.

Ответ 3

Есть другая причина для этого типа проблемы, которой я хотел бы поделиться, потому что я борюсь с этой проблемой в течение некоторого времени, и я не мог найти никакого ответа на SO.

В репозитории вроде:

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

}

Если у вашей сущности UserEntity нет аннотации @Entity для класса, у вас будет та же ошибка.

Эта ошибка сбивает с толку для этого случая, потому что вы сосредоточены на попытке решить проблему, связанную с тем, что Spring не обнаружил репозиторий, но проблема заключается в сущности. И если вы пришли к этому ответу, пытаясь проверить свой репозиторий, этот ответ может вам помочь.

Ответ 4

Кажется, ваша аннотация @ComponentScan установлена ​​неправильно. Попробуйте:

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

На самом деле вам не нужно сканирование компонентов, если у вас есть основной класс в верхней части структуры, например, непосредственно в пакете com.pharmacy.

Кроме того, вам не нужны оба

@SpringBootApplication
@EnableAutoConfiguration

Аннотация @SpringBootApplication включает @EnableAutoConfiguration по умолчанию.

Ответ 5

У меня была аналогичная проблема, когда я получал NoSuchBeanDefinitionException в Spring Boot (в основном во время работы с репозиторием CRUD), мне пришлось поместить следующие аннотации в основной класс:

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

Кроме того, убедитесь, что в реализациях есть аннотации @Component.

Ответ 6

Чтобы расширить вышеприведенные ответы, вы можете добавить более одного пакета в свой тег EnableJPARepositories, чтобы избежать ошибки "Object not mapped" только после указания пакета репозитория.

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

}

Ответ 7

Вот ошибка: как кто-то сказал ранее, вы используете org.pharmacy вместо com.pharmacy в компонентах.

    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 {

Ответ 8

У меня была аналогичная проблема, но с другой причиной:

В моем случае проблема заключалась в том, что в интерфейсе, определяющем репозиторий

public interface ItemRepository extends Repository {..}

Я пропускал типы шаблона. Правильная настройка:

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

сделал трюк.

Ответ 9

У меня тоже были проблемы с этой темой. Вы должны убедиться, что вы определили пакеты в классе загрузчика Spring, как в следующем примере:

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

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

Надеюсь, это поможет!

Ответ 10

Вы сканируете не тот пакет: @ComponentScan (" org.pharmacy")

Где, как и должно быть: @ComponentScan (" com.pharmacy")

Так как имена ваших пакетов начинаются с com, а не с org.

Ответ 11

Добавление этого сработало для меня @EnableAutoConfiguration

Ответ 12

В @ComponentScan("org.pharmacy") вы объявляете пакет org.pharmacy. Но ваши компоненты в пакете com.pharmacy.

Ответ 13

Если вы столкнулись с этой проблемой при модульном тестировании с @DataJpaTest, то вы найдете решение ниже.

Spring boot не инициализирует bean-компоненты @Repository для @DataJpaTest. Попробуйте одно из двух исправлений ниже, чтобы они были доступны:

Во-первых

Используйте вместо этого @SpringBootTest. Но это загрузит весь контекст приложения.

Второй(лучшие решения)

Импортируйте нужный репозиторий, как показано ниже

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

@Autowired
private MyRepository myRepository;

Ответ 14

В SpringBoot JpaRepository не включены автоматически по умолчанию. Вы должны явно добавить

@EnableJpaRepositories("packages")
@EntityScan("packages")