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

Erro: Quando medico não é escolhido inserir a especialidade é obrigatorio

Estou com 2 problemas...

Primeiro

Quando vou agendar uma consulta somente colocando a especialidade no insomnia da erro 500 "Erro: Quando medico não é escolhido inserir a especialidade é obrigatorio!"

{
    "idPaciente": 1,
  "especialidade": "ORTOPEDIA",
    "data": "23/04/2024 10:00"
}
@Service
public class AgendaDeConsultas {
    @Autowired
    ConsultaRepository consultaRepository;
    @Autowired
    MedicoRepository medicoRepository;
    @Autowired
    PacienteRepository pacienteRepository;

    @Autowired
    private List<ValidadorAgendamentoConsulta> validadores;

    public DadosoDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados){

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

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

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

        var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
        var medico = escolherMedicos(dados);
        var consulta = new Consulta(null, medico, paciente, dados.data(), null);
        consultaRepository.save(consulta);

        return new DadosoDetalhamentoConsulta(consulta);

    }

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

        if (dados.especialidade() != null){
            throw new ValidacaoException("Quando medico não é escolhido inserir a especialidade é obrigatorio!");
        }

        return medicoRepository.escolherMedicoAleatorioLivre(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());
    }
}

Segundo problema

Eu segui o curso e tive outro problema na parte do SpringDoc, ele da acesso negado no http://localhost:8080/v3/api-docs ou /swagger-ui

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(req -> {
                    req.requestMatchers(HttpMethod.POST, "/login", "/v3/api-docs","/swagger-ui.html", "/swagger-ui/**").permitAll();
                //    req.requestMatchers(HttpMethod.DELETE, "/medicos").hasRole(ADMIN);
                //    req.requestMatchers(HttpMethod.DELETE, "/pacientes").hasRole(ADMIN);
                    req.anyRequest().authenticated();
                })
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

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

8 respostas

OI, pode adicionar qual erro ocorre?

Não há erro no console do IntelliJ IDEA... Mas quando vou acessar o localhost:8080/swagger-ui.html ou /v3/api-docs da Acesso Negado

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

Agora no Insomnia o /login funciona sem problemas.


Agora para agendar uma consulta somente com a especialidade da erro 500

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

Verifiquei sobre o erro de inserção de médico

Você está validando incorretamente a especialidade

if (dados.especialidade() != null){
            throw new ValidacaoException("Quando medico não é escolhido inserir a especialidade é obrigatorio!");
        }

No trecho você está lançando exceção caso a especialidade NÃO SEJA NULA, e você está enviando ela no body da requisição ou seja, ela de fato ela não é nula.

Imagino que o seu desejo seria o seguinte trecho

    if (dados.especialidade() == null){
            throw new ValidacaoException("Quando medico não é escolhido inserir a especialidade é obrigatorio!");
        }

Aqui, caso sua especialidade não seja preenchida a exceção será lançada corretamente. Caso tenha dúvidas sobre essa solução pode responder aqui.

solução!

Sobre seu acesso negado ao docs e swagger encontrei no stackoverflow um caso semelhante. https://stackoverflow.com/questions/73073519/cannot-open-swagger-ui-in-its-version-3-in-my-spring-boot-example

A aparente solução seria

    private static final String[] AUTH_WHITELIST = {

            // for Swagger UI v2
            "/v2/api-docs",
            "/swagger-ui.html",
            "/swagger-resources",
            "/swagger-resources/**",
            "/configuration/ui",
            "/configuration/security",
            "/webjars/**",

            // for Swagger UI v3 (OpenAPI)
            "/v3/api-docs/**",
            "/swagger-ui/**"
    };

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) {
        httpSecurity
                // ... other configuration settings                
                .antMatchers(AUTH_WHITELIST).permitAll();
        // ...
    }

Outro ponto que observei

 .authorizeHttpRequests(req -> {
                    req.requestMatchers(HttpMethod.POST, "/login", "/v3/api-docs","/swagger-ui.html", "/swagger-ui/**").permitAll();
                //    req.requestMatchers(HttpMethod.DELETE, "/medicos").hasRole(ADMIN);
                //    req.requestMatchers(HttpMethod.DELETE, "/pacientes").hasRole(ADMIN);
                    req.anyRequest().authenticated();
                })****

Você está permitindo os paths corretos, porém apenas pro método POST, sendo que quando você acessa seu navegador toda requisição é um GET ou seja seria

  req.requestMatchers(HttpMethod.GET , "/login", "/v3/api-docs","/swagger-ui.html", "/swagger-ui/**").permitAll();

E não

  req.requestMatchers(HttpMethod.POST, "/login", "/v3/api-docs","/swagger-ui.html", "/swagger-ui/**").permitAll();

Obrigado deu certo agora.

Mas o SwaggerUi deu um erro...

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

Agora tenho que achar porque esta falando isso...

https://stackoverflow.com/questions/70906081/springboot-swagger3-failed-to-load-remote-configuration Experimente


@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/swagger-ui/**", "/bus/v3/api-docs/**");
    }
}

Aqui simplesmente funcionou colocando o "/v3/api-docs" na caixa de texto e clicando em explore.... Ele so não entra diretamente como a aula por algum motivo...

Obrigado pela ajuda !

Nada , caso tenha te auxiliado de alguma forma e você não tenha mais dúvidas vc pode marcar o tópico como solucionado.