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

Erro na classe AgendaDeConsultas ao compilar o projeto

Não é possivel compilar o projeto, acusa o seguinte erro:

Erro: java: constructor Consulta in class med.voll.api.domain.consulta.Consulta cannot be applied to given types; required: no arguments found: ,med.voll.api.domain.medico.Medico,med.voll.api.domain.paciente.Paciente,@jakarta.validation.constraints.NotNull,@jakarta.validation.constraints.Future java.time.LocalDateTime reason: actual and formal argument lists differ in length

package med.voll.api.domain.consulta;

import med.voll.api.domain.ValidacaoException;
import med.voll.api.domain.consulta.validacaoes.ValidadorAgendamentoDeConsulta;
import med.voll.api.domain.medico.Medico;
import med.voll.api.domain.medico.MedicoRepository;
import med.voll.api.domain.paciente.PacienteRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AgendaDeConsultas {

    @Autowired
    private ConsultaRepository consultaRepository;

    @Autowired
    private MedicoRepository medicoRepository;

    @Autowired
    private PacienteRepository pacienteRepository;

    @Autowired
    private List<ValidadorAgendamentoDeConsulta> validadores;
    public DadosDetalhamentoConsulta agendar (DadosAgendamentoConsulta dados) {

        if (!pacienteRepository.existsById(dados.idPaciente())) {
            throw new ValidacaoException("id paciente não existe");
        }
        if((dados.idMedico() != null) && !medicoRepository.existsById(dados.idMedico())){
            throw new ValidacaoException("id medico não existe");
        }

        validadores.forEach(v -> v.validar(dados));

        var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
        var medico = escolherMedico(dados);
        var consulta = new Consulta(null, medico, paciente, dados.data()); /*essa linha acusa erro*/
        consultaRepository.save(consulta);

        return new DadosDetalhamentoConsulta(consulta);
    }

    private Medico escolherMedico(DadosAgendamentoConsulta dados) {
        if (dados.idMedico() != null) {
            return medicoRepository.getReferenceById(dados.idMedico());
        }

        if (dados.especialidade() == null) {
            throw new ValidacaoException("Especialidade obrigatória quando não foi selecionado médico");
        }

        return medicoRepository.escolherMedicoAleatorioLivreNaData(dados.especialidade(), dados.data());
    }

}
package med.voll.api.domain.consulta;

import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.domain.medico.Medico;
import med.voll.api.domain.paciente.Paciente;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Table(name = "consultas")
@Entity(name = "Consulta")
@Getter
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
public class Consulta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "medico_id")
    private Medico medico;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "paciente_id")
    private Paciente paciente;

    private LocalDateTime data;

}
3 respostas

Beleza Tiago?

O erro que você está enfrentando indica que não há um construtor na classe Consulta que corresponda aos argumentos passados ao tentar criar uma nova instância desta classe. O construtor que está sendo chamado parece exigir três argumentos: um objeto Medico, um objeto Paciente e uma LocalDateTime.

Para resolver esse erro, você precisa adicionar um construtor na classe Consulta que aceite esses três argumentos. Aqui está como você pode fazer isso:

@Data
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
@Entity(name = "Consulta")
public class Consulta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "medico_id")
    private Medico medico;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "paciente_id")
    private Paciente paciente;

    private LocalDateTime data;

    public Consulta(Medico medico, Paciente paciente, LocalDateTime data) {
        this.medico = medico;
        this.paciente = paciente;
        this.data = data;
    }
}

Com este construtor adicionado, agora você pode criar uma nova instância de Consulta passando um objeto Medico, um objeto Paciente e uma LocalDateTime, conforme esperado pelo método agendar() na classe AgendaDeConsultas.

Certifique-se de que todos os argumentos necessários estejam sendo passados corretamente ao criar uma nova consulta no método agendar().

Espero ter contribuído

Opa, então, no projeto original do curso não tem o construtor, com o construtor criado, ocorre outro problema:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consultaController': Unsatisfied dependency expressed through field 'agenda': Error creating bean with name 'agendaDeConsultas': Unsatisfied dependency expressed through field 'medicoRepository': Error creating bean with name 'medicoRepository' defined in med.voll.api.domain.medico.MedicoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract med.voll.api.domain.medico.Medico med.voll.api.domain.medico.MedicoRepository.escolherMedicoAleatorioLivreNaData(med.voll.api.domain.medico.Especialidade,java.time.LocalDateTime); Reason: Validation failed for query for method public abstract med.voll.api.domain.medico.Medico med.voll.api.domain.medico.MedicoRepository.escolherMedicoAleatorioLivreNaData(med.voll.api.domain.medico.Especialidade,java.time.LocalDateTime)

package med.voll.api.controller;

import jakarta.validation.Valid;
import med.voll.api.domain.consulta.AgendaDeConsultas;
import med.voll.api.domain.consulta.DadosAgendamentoConsulta;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("consultas")
public class ConsultaController {

    @Autowired
    private AgendaDeConsultas agenda;

    @PostMapping
    @Transactional
    public ResponseEntity agendar(@RequestBody @Valid DadosAgendamentoConsulta dados) {
        var dto = agenda.agendar(dados);
        return ResponseEntity.ok(dto);
    }
}
package med.voll.api.domain.consulta;

import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.NotNull;
import med.voll.api.domain.medico.Especialidade;

import java.time.LocalDateTime;

public record DadosAgendamentoConsulta(
        Long idMedico,

        @NotNull
        Long idPaciente,

        @NotNull
        @Future
        LocalDateTime data,

        Especialidade especialidade) {
}
solução!

Olá, Anderson!

O erro org.springframework.beans.factory.UnsatisfiedDependencyException geralmente ocorre quando o Spring não consegue resolver uma dependência durante a criação de um bean. No seu caso, parece que o Spring está tendo problemas para criar o bean consultaController porque não consegue resolver a dependência agenda.

Aqui estão algumas coisas que você pode verificar:

Anotação @Autowired: A anotação @Autowired é usada para injetar automaticamente beans no Spring. Verifique se a classe AgendaDeConsultas é um bean gerenciado pelo Spring. Se não for, você pode torná-la um bean adicionando a anotação @Component ou @Service à classe AgendaDeConsultas. Bean medicoRepository: O erro também menciona que não foi possível criar o bean medicoRepository. Verifique se a interface MedicoRepository estende uma das interfaces do Spring Data JPA, como JpaRepository ou CrudRepository. Método escolherMedicoAleatorioLivreNaData: O erro indica que a validação falhou para a consulta do método escolherMedicoAleatorioLivreNaData. Verifique se a consulta está correta e se os parâmetros do método correspondem aos parâmetros da consulta. Espero que isso ajude! Se você tiver mais perguntas, fique à vontade para perguntar.

https://stackoverflow.com/questions/58194552/how-to-fix-error-creating-bean-with-name-unsatisfied-dependency-expressed-thr