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

Erro ao compilar após criar as validações

Primeiro erro:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-10-02T20:18:08.226-03:00 ERROR 20588 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

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 'consultaRepository': Error creating bean with name 'consultaRepository' defined in med.voll.api.domain.consulta.ConsultaRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); Reason: Failed to create query for method public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); No property 'ID' found for type 'Medico'; Did you mean 'id'; Traversed path: Consulta.medico
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:767) ~[spring-beans-6.0.12.jar:6.0.12]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:747) ~[spring-beans-6.0.12.jar:6.0.12]

Segundo:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'agendaDeConsultas': Unsatisfied dependency expressed through field 'consultaRepository': Error creating bean with name 'consultaRepository' defined in med.voll.api.domain.consulta.ConsultaRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); Reason: Failed to create query for method public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); No property 'ID' found for type 'Medico'; Did you mean 'id'; Traversed path: Consulta.medico
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:767) ~[spring-beans-6.0.12.jar:6.0.12]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:747) ~[spring-beans-6.0.12.jar:6.0.12]

Terceiro:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'consultaRepository' defined in med.voll.api.domain.consulta.ConsultaRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); Reason: Failed to create query for method public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); No property 'ID' found for type 'Medico'; Did you mean 'id'; Traversed path: Consulta.medico

Quarto:

Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoIDAndData(java.lang.Long,java.time.LocalDateTime); No property 'ID' found for type 'Medico'; Did you mean 'id'; Traversed path: Consulta.medico

quinto:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property 'ID' found for type 'Medico'; Did you mean 'id'; Traversed path: Consulta.medico
9 respostas
package med.voll.api.domain.consulta;

import java.time.LocalDateTime;

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

public interface ConsultaRepository extends JpaRepository<Consulta, Long> {

    boolean existsByPacienteIDAndDataBetween(Long idPaciente, LocalDateTime primeiroHorario, LocalDateTime ultimoHorario);

    boolean existsByMedicoIDAndData(Long idMedico, LocalDateTime data);

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

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import med.voll.api.controller.DadosCancelamentoConsulta;
import med.voll.api.domain.ValidacaoException;
import med.voll.api.domain.consulta.validacoes.ValidadorAgendamentoConsulta;
import med.voll.api.domain.medico.Medico;
import med.voll.api.domain.medico.MedicoRepository;
import med.voll.api.domain.paciente.PacienteRepository;

@Service
public class AgendaDeConsultas {

    @Autowired
    private ConsultaRepository consultaRepository;
    @Autowired
    private MedicoRepository medicoRepository;

    @Autowired
    private PacienteRepository pacienteRepository;

    //Aplicação dos validadores
    @Autowired
    private List<ValidadorAgendamentoConsulta> validadores;


    public void agendar(DadosAgendamentoConsulta dados){

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

        if(!pacienteRepository.existsById(dados.idPaciente())){
            throw new ValidacaoException("Id informado do paciente não existe!");
        }

        if( dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())){
            throw new ValidacaoException("Id informado do medico não existe!");
        }

        var paciente = pacienteRepository.findById(dados.idPaciente()).get();
        var medico = escolherMedico(dados);
        var consulta = new Consulta(null, medico, paciente, dados.data(), null);

        consultaRepository.save(consulta);
    }


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

        if(dados.especialidade() == null){
            throw new ValidacaoException("Especialidade obrigatoria quando medico não informado");
        }

        return medicoRepository.escolherMedicoAleatorioLivreData(dados.especialidade(), dados.data());
        

    }

    public void cancelar(DadosCancelamentoConsulta dados) {
    if (!consultaRepository.existsById(dados.idConsulta())) {
        throw new ValidacaoException("Id da consulta informado não existe!");
    }

    var consulta = consultaRepository.getReferenceById(dados.idConsulta());
    consulta.cancelar(dados.motivo());
}


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

import java.time.LocalDateTime;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface MedicoRepository extends JpaRepository<Medico, Long> {

    Page<Medico> findAllByAtivoTrue(Pageable paginacao);

    @Query("""
                select m from Medico m
                where
                m.ativo = true
                and
                m.especialidade = :especialidade
                and
                m.id not in(
                    select c.medico.id from Consulta c
                    where
                    c.data = :data
                )
                order by rand()
                limit 1                      
            """)

    Medico escolherMedicoAleatorioLivreData(Especialidade especialidade, LocalDateTime data);
   
    
    @Query("""
            select m.ativo from Medico m where m.id = :idMedico
            """)
    Boolean findAtivoById(Long idMedico);
}
solução!

Na interface ConsultaRepository os atributos estão:

boolean existsByPacienteIDAndDataBetween(Long idPaciente, LocalDateTime primeiroHorario, LocalDateTime ultimoHorario);

boolean existsByMedicoIDAndData(Long idMedico, LocalDateTime data);

Arrumei o ID e deixei Id e o erro foi corrgido, agora estou enfrentando outro problema.

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-10-02T23:26:53.790-03:00 ERROR 16688 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

Field validadoresCancelamento in med.voll.api.domain.consulta.AgendaDeConsultas required a bean of type 'java.util.List' 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 'java.util.List' in your configuration.

**Outro erro ** Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oi!

Na sua interface ConsultaRepository os nomes dos métodos estão com a propriedade ID, mas deveria ser Id (letra d em minúsculo).

Eu mudei, como disse aqui. Mas estou enfrentando outros erros, continuei com o curso sem conseguir testar, abro um topico novo?

Pode mandar aqui mesmo os novos erros que está tendo.