1
resposta

[Bug] Field medicoRepository in med.voll.api.controller.MedicoController required a bean of type 'med.voll.api.medico.MedicoRepository' that could not be found.

Boa noite, tarde ou dia...

Estou tento um erro na injeção do repository

2023-04-15T21:26:19.197-03:00  WARN 182122 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'medicoController': Unsatisfied dependency expressed through field 'medicoRepository': No qualifying bean of type 'med.voll.api.medico.MedicoRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2023-04-15T21:26:19.199-03:00  INFO 182122 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-04-15T21:26:19.215-03:00  INFO 182122 --- [  restartedMain] .s.b.a.l.ConditionEvaluationReportLogger : 
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-04-15T21:26:19.231-03:00 ERROR 182122 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   :

Description:

Field medicoRepository in med.voll.api.controller.MedicoController required a bean of type 'med.voll.api.medico.MedicoRepository' 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 'med.voll.api.medico.MedicoRepository' in your configuration.

Estava tento problemas com o application.properties, uma coisa que experimentei foi tentar usar o application.yml:

spring:
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/vollmed_api
        username: estudante_alura
        password: *****

Meu repository esta assim:

package med.voll.api.medico;

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

public interface MedicoRepository extends JpaRepository<Medico, Long> {
}

Meu controller:

[...]
@RestController
@RequestMapping(path = "/medicos")
public class MedicoController {

    @Autowired
    private MedicoRepository medicoRepository;

    @PostMapping
    @Transactional
    public void cadastrar(@RequestBody DadosCadastroMedico dados) {
        medicoRepository.save(new Medico(dados));
    }

}

O meu ApiApplication esta assim:

package med.voll.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class ApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

}

O motivo para eu ter colocar do exclude = {DataSourceAutoConfiguration.class}) é por que estava dando o seguinte erro antes:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

A única solução que encontrei que funcionou foi definir esse exclude.

As dependencias no meu pom.xml esta assim:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-mysql</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
    </dependencies>

    [...]
1 resposta

Olá Lucas, tudo bem?

Pelo erro apresentado, parece que o Spring não está encontrando o bean do tipo 'med.voll.api.medico.MedicoRepository'. Isso pode acontecer por diversos motivos, como por exemplo, o pacote onde está a classe repository não estar sendo escaneado pelo Spring.

Uma solução seria adicionar a anotação @Repository na sua interface MedicoRepository, para que o Spring reconheça que essa classe é um repositório e possa gerenciar a injeção de dependência corretamente.

Além disso, verifique se o pacote onde está a classe MedicoRepository está sendo escaneado pelo Spring. Você pode fazer isso adicionando a anotação @ComponentScan na sua classe ApiApplication e passando o pacote como parâmetro.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software