Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

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

Olá, pessoal!

Estou na última parte do curso, fazendo o método de delete. Ao realizar o que o professor passou, o seguinte erro começou a aparecer:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-05-07T20:46:55.977-03:00 ERROR 2024 --- [api] [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

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

Juro que já tentei revirar o meu código do avesso e tentei pesquisar em todos os sites, mas não consigo encontrar o que pode ser. Desculpe se é algum erro muito obvio e bobo, mas não to conseguindo resolver isso!

Até tentei adicionar o @EntityScan, mas nada:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EntityScan(basePackages = {"br.com.med.voll.api.repository"})
public class ApiApplication {

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

}

Meu repository:

@Repository
public interface MedicoRepository extends JpaRepository <MedicoEntity, Long> {
}

Meu controller:

package br.com.med.voll.api.controller;

import br.com.med.voll.api.dto.DadosAtualizaoMedicoDTO;
import br.com.med.voll.api.dto.DadosCadastroMedicoDTO;
import br.com.med.voll.api.dto.DadosListagemMedicoDTO;
import br.com.med.voll.api.entity.MedicoEntity;
import br.com.med.voll.api.repository.MedicoRepository;
import br.com.med.voll.api.service.MedicoService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/medicos")
public class MedicoController {

    @Autowired
    private MedicoRepository repository;

    @Autowired
    private MedicoEntity entity;

    @PostMapping
    @Transactional
    public void cadastrarMedico(@RequestBody @Valid DadosCadastroMedicoDTO dados) {
        repository.save(new MedicoEntity(dados));
    }

    @GetMapping
    public Page<DadosListagemMedicoDTO> listar(@PageableDefault(size = 3, sort = {"email"}) Pageable paginacao) {
        return repository.findAll(paginacao).map(DadosListagemMedicoDTO::new);
    }

    @PutMapping
    @Transactional
    public void atualizar(@RequestBody @Valid DadosAtualizaoMedicoDTO dados) {
        MedicoEntity medico = repository.getReferenceById(dados.id());
        entity.atualizarInformacoesMedico(dados);
    }

    @DeleteMapping("/{id}")
    @Transactional
    public void excluir(@PathVariable(name = "id") Long id) {
        repository.deleteById(id);
    }

}

Muito obrigado desde já, galera <3

4 respostas

Oi!

Na sua classe main a anotação @SpringBootApplication está com o parâmetro exclude = {DataSourceAutoConfiguration.class} e com isso o Spring vai ignorar as classes repository do projeto. Deixe assim:

@SpringBootApplication
public class ApiApplication {

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

}

Isso funcionou... Mas depois que arrumei ele tá dando esse mesmo erro mas só que no Entity.

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

Description:

Field entity in br.com.med.voll.api.controller.MedicoController required a bean of type 'br.com.med.voll.api.entity.MedicoEntity' 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 'br.com.med.voll.api.entity.MedicoEntity' in your configuration.

Meu Entity:

package br.com.med.voll.api.entity;

import br.com.med.voll.api.dto.DadosAtualizaoMedicoDTO;
import br.com.med.voll.api.dto.DadosCadastroMedicoDTO;
import br.com.med.voll.api.enums.Especialidade;
import jakarta.persistence.*;
import lombok.*;

@Table(name = "medicos")
@Entity(name = "Medico")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class MedicoEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    private String telefone;
    private String crm;
    private Boolean ativo;

    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;

    @Embedded
    private EnderecoEntity endereco;

    public MedicoEntity(DadosCadastroMedicoDTO dados) {
        this.ativo = true;
        this.nome = dados.nome();
        this.email = dados.email();
        this.telefone = dados.telefone();
        this.crm = dados.crm();
        this.especialidade = dados.especialidade();
        this.endereco = new EnderecoEntity(dados.endereco());
    }


    public void atualizarInformacoesMedico(DadosAtualizaoMedicoDTO dados) {
        if(dados.nome() != null) {
            this.nome = dados.nome();
        }

        if(dados.telefone() != null) {
            this.telefone = dados.telefone();
        }

        if(dados.endereco() != null) {
            this.endereco.atualizarInformacoesEndereco(dados.endereco());
        }
    }

    public void excluir() {
        this.ativo = false;
    }
}

Também tentei adicionar o @EntityScan com o pacote do entity, mas mesmo assim o erro persiste.

solução!

No seu controller tem esse atributo:

@Autowired
private MedicoEntity entity;

Entidades JPA não são gerenciadas pelo Spring e não devem ser injetadas ;)

Muito obrigado, Rodrigo! Não tinha percebido isso e nem sei o que tá fazendo ai kkkkkk.

Valeuzão!