Как мне решить следующую ошибку, которую я получаю при использовании аннотации @Autowired в Spring? - PullRequest
0 голосов
/ 26 октября 2019

Я новичок в Spring и у меня возникли некоторые проблемы при попытке использовать аннотацию @Autowired, при попытке внедрить класс Repository внутри PostController

@Controller
@RequestMapping("/posts")

public class PostController {


    @Autowired 
    private Repository repository;


    @RequestMapping(value="",method= RequestMethod.GET)
    public String listPosts(Model model){
        model.addAttribute("posts",repository.findAll());
        return "posts/lists";
    }
}

public interface Repository extends CrudRepository<Posts,Long> {
}

Это сообщения об ошибках, которые я получаю

Исключение в потоке "main" org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'postController': сбой внедрения зависимостей с автопроводкой;вложенное исключение: org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: private domain.Repository controllers.PostController.repository;Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не найден квалифицирующий компонент типа [domain.Repository] для зависимости: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат для автоматического подключения для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательный = true)} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnost.rag. factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1208) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:537) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:476) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:303) в org.springframework.beans.factory.engtonBeanorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java: 299) в org.springframework.beans.factory.support. context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:759) по адресу org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:480.extext.Web.Web.Text.Web.Ext.Web. Java: 117) в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:689) в org.springframework.boot.SpringApplication.run (SpringApplication.java:321) в org.springframework.boot.SpringApplication. .java: 969) в org.springframework.boot.SpringApplication.run (SpringApplication.java:958) в MyApplication.main (MyApplication.java:7). Причина: org.springframework.beans.factory.BeanCreationException: Не удалось автоматически связать поле: частный домен. Контроллеры репозитория.PostController.repository;Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не найден квалифицирующий компонент типа [domain.Repository] для зависимости: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат для автоматического подключения для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (Autowiredera. beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:88) в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcess)Вызвано: org.springframework.beans.factory.NoSuchBeanDefinitionException: не найден квалифицируемый компонент типа [domain.Repository] для зависимости: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат для автоматического подключения для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException (DefaultLisory.Fe. factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:1047) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:942) в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement. inject (AutowiredAnnotationBeanPostProcessor.java:533) ... еще 18

Ответы [ 4 ]

1 голос
/ 26 октября 2019

Вы должны создать свой собственный репозиторий и расширить его из репозитория, теперь вы используете интерфейс Spring Repository.

@Repository
public interface PostRepository extends CrudRepository<Posts,Long> {

}

и @Autowire it

@Autowired 
private PostRepository repository;
0 голосов
/ 27 октября 2019

Исключением здесь является NoSuchBeanDefinitionException.

На основе javadoc-api

public class NoSuchBeanDefinitionException
extends BeansException

Exception thrown when a BeanFactory is asked for a bean instance for which it cannot find a definition. This may point to a non-existing bean, a non-unique bean, or a manually registered singleton instance without an associated bean definition.

Существует множество возможностей, которые могут привести к этому исключению. Пожалуйста, прочитайте это подробное объяснение, чтобы получить полную картину. -> Что такое исключение NoSuchBeanDefinitionException и как его исправить?

0 голосов
/ 26 октября 2019

Для хорошей практики jpa, hibernate и особенно для лучшей обработки исключений персистентности вы должны добавить аннотацию @Repository ко всем вашим репозиториям.

@Repository
public interface PostRepository extends CrudRepository<Posts,Long> {

}

Теперь, чтобы создать экземпляр класса репозитория, вы должны сделать это как открытый.

@Autowired 
PostRepository postRepository;

Также отметьте, что в качестве хорошей практики вы создаете сервис для обработки всей логики процесса, в котором используется ваш репозиторий.

0 голосов
/ 26 октября 2019

Глядя на ваш журнал, я предлагаю вам проверить две точки:

  • - это домен . Репозиторий с аннотацией @Component?
  • если приложение запускается в пакет controllers , оно будет анализировать только классы ниже пакета controllers , исключая пакет domain (где Repository) is)

для второго пункта - быстрое исправление, вы можете либо переставить пакеты в пакете myapp и запустить приложение Spring из класса на этом уровне,или больше общие конфигурации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...