org.springframework.beans.factory.Исключение BeanCreationNotAllowedException

#java #spring #spring-data-jpa

#java #весна #spring-data-jpa

Вопрос:

Я переделывал свой код, чтобы использовать Spring data JPA. И когда я запускаю свой код, возвращает эту ошибку:

     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:212)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
    at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:245)
    at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:197)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:134)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.publishEventIfRequired(DataSourceInitializedPublisher.java:99)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.access$100(DataSourceInitializedPublisher.java:50)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher$DataSourceSchemaCreatedPublisher.lambda$postProcessEntityManagerFactory$0(DataSourceInitializedPublisher.java:200)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
2020-09-24 21:25:35.043  INFO 13900 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2020-09-24 21:25:35.044  INFO 13900 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2020-09-24 21:25:35.052  INFO 13900 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-09-24 21:25:35.142 ERROR 13900 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field cozinhaRepository in com.agls.algafood.algafood.api.controller.CozinhaController required a bean of type 'com.agls.algafood.algafooddomain.repository.CozinhaRepository' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.agls.algafood.algafooddomain.repository.CozinhaRepository' in your configuration.
  

Класс cozinharrepository:

 package com.agls.algafood.algafooddomain.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.agls.algafood.algafood.domain.model.Cozinha;

@Repository
public interface CozinhaRepository extends JpaRepository<Cozinha, Long> {

    // List<Cozinha> consultarPorNome(String nome);

}
  

Класс CozinhaController:

 package com.agls.algafood.algafood.api.controller;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.agls.algafood.algafood.domain.exception.EntidadeEmUsoException;
import com.agls.algafood.algafood.domain.exception.EntidadeNaoEncontradaException;
import com.agls.algafood.algafood.domain.model.Cozinha;
import com.agls.algafood.algafood.domain.service.CadastroCozinhaService;
import com.agls.algafood.algafooddomain.repository.CozinhaRepository;

@RestController
@RequestMapping(value = "/cozinhas", produces = MediaType.APPLICATION_JSON_VALUE)
public class CozinhaController {

    @Autowired
    private CozinhaRepository cozinhaRepository;

    @Autowired
    private CadastroCozinhaService cadastroCozinha;

    @GetMapping
    public List<Cozinha> listar() {
        return cozinhaRepository.findAll();
    }

    @GetMapping("/{cozinhaId}")
    public ResponseEntity<Cozinha> buscar(@PathVariable Long cozinhaId) {
        Optional<Cozinha> cozinha = cozinhaRepository.findById(cozinhaId);

        if (cozinha.isPresent()) {
            return ResponseEntity.ok(cozinha.get());
        }
        return ResponseEntity.notFound().build();

    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Cozinha adicionar(@RequestBody Cozinha cozinha) {
        return cadastroCozinha.salvar(cozinha);
    }

    @PutMapping("/{cozinhaId}")
    public ResponseEntity<Cozinha> atualizar(@PathVariable Long cozinhaId, @RequestBody Cozinha cozinha) {

        Optional<Cozinha> cozinhaAtual = cozinhaRepository.findById(cozinhaId);

        if (cozinhaAtual.isPresent()) {
            BeanUtils.copyProperties(cozinha, cozinhaAtual.get(), "id");
            Cozinha cozinhaSalva = cadastroCozinha.salvar(cozinhaAtual.get());
            return ResponseEntity.ok(cozinhaSalva);
        }

        return ResponseEntity.notFound().build();
    }

    @DeleteMapping("/{cozinhaId}")
    public ResponseEntity<Cozinha> remover(@PathVariable Long cozinhaId) {
        try {
            cadastroCozinha.excluir(cozinhaId);
            return ResponseEntity.noContent().build();
        } catch (EntidadeEmUsoException e) {
            return ResponseEntity.status(HttpStatus.CONFLICT).build();
        } catch (EntidadeNaoEncontradaException e) {
            return ResponseEntity.notFound().build();
        }
    }
}
  

Я выполнил внедрение зависимостей с помощью @Autowired в поле cozinhaRepository в классе CozinhaController, строка 32. И класс CozinhaRepository отмечен с помощью @Repository, но ошибка остается

ответственный за проект: https://github.com/andreleao1/algaFood

Ответ №1:

Ваш импорт неверен

 import com.agls.algafood.algafooddomain.repository.CozinhaRepository;
  

Это должно быть

 import com.agls.algafood.algafood.infrastructure.repository.CozinhaRepository;
  

введите описание изображения здесь

Имейте в виду, что в этой папке Spring будет искать компоненты, которые вы аннотировали.

Аннотация @SpringBootApplication использует конфигурацию @ComponentScan по умолчанию. Вы можете проверить более подробную информацию об этом здесь

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

Ответ №2:

Я исправляю это, меняю свой импорт.

неправильный импорт:

import com.agls.algafood.algafooddomain.repository.CozinhaRepository;

Я изменил импорт в классе на:

import com.agls.algafood.algafood.domain.repository.CozinhaRepository;

Спасибо!