6
respostas

Ausência de indicação de erro quando cadastra médico

Olá! Após fazer todas as implementações de segurança e autorização, quanto tento cadastrar, por exemplo, um médico com CRM já existente, no Postman indica erro 403 com body vazio, sem indicar qual campo está errado. No Run do Intellij aparece, mas no Postman não.

Ele muda assim mesmo ou deveria seguir aparecendo no body do postman? Obrigada!

6 respostas

Oi!

Nesse caso era para ser devolvido o código 400 com as mensagens de erro. Se foi devolvido erro 403, é provável que seja por 2 motivos:

  1. JWT expirado ou não está sendo enviado nessa requisição, causando assim o erro 403
  2. O algoritmo que faz a validação de CRM já cadastrado está lançando uma exception que não foi tratada na API, fazendo com que o Spring Security capture essa exception e devolva o erro 403

Verifique isso no seu projeto.

Ih, dei uma lida em todas as opções de erro na aula "Ainda com erro 403?", alterei algumas coisas e agora nem fazer requisição de detalhamento ou listagem eu consigo mais, só consigo fazer o login mesmo. Aqui vão algumas telas se puderes me ajudar: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Na sua classe SecurityConfigurations está faltando adicionar o filter:

and().addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)

Beleza, foi isso mesmo que removi.

Agora a questão de tentar cadastrar um médico com crm já existente ou um paciente com cpf já cadastrado, continua dando erro no Postman, mas ele considera como erro 403, não 400, por isso não está pegando o tratamento de erros adequado. Não sei se seria uma boa prática construir um tratarErro403 neste caso...

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

O ideal é escrever um código para realizar essa validação e lançar uma exception caso ela não seja respeitada. Algo como:

MedicoController:

@PostMapping
@Transactional
public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroMedico dados, UriComponentsBuilder uriBuilder) {
    var medicoJaCadastrado = repository.existsByCrm(dados.crm());
    if (medicoJaCadastrado) {
        throw new ValidacaoException("CRM já cadastrado para outro médico!");
    }
    
    var medico = new Medico(dados);
    repository.save(medico);

    var uri = uriBuilder.path("/medicos/{id}").buildAndExpand(medico.getId()).toUri();

    return ResponseEntity.created(uri).body(new DadosDetalhamentoMedico(medico));
}

ValidacaoException:

public class ValidacaoException extends RuntimeException {
    public ValidacaoException(String mensagem) {
        super(mensagem);
    }
}

MedicoRepository:

public interface MedicoRepository extends JpaRepository<Medico, Long> {

    boolean existsByCrm(String crm);

}

TratadorDeErros:

@ExceptionHandler(ValidacaoException.class)
public ResponseEntity tratarErroRegraDeNegocio(ValidacaoException ex) {
    return ResponseEntity.badRequest().body(ex.getMessage());
}

No terceiro curso da formação será visto essa parte de validação de regra de negócio, com a funcionalidade de agendamento de consultas.

Perfeito, professor! Muito obrigada pela ajuda, funcionou :)

Deixei meu controller assim:

@PostMapping @Transactional public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroMedico dados, UriComponentsBuilder uriComponentsBuilder) { var medicoJaCadastradoCrm = repository.existsByCrm(dados.crm()); var medicoJaCadastradoEmail = repository.existsByEmail(dados.email());

    if (medicoJaCadastradoCrm) {
        throw new ValidacaoException("CRM já cadastrado para outro médico");
    }
    if (medicoJaCadastradoEmail) {
        throw new ValidacaoException("E-mail já cadastrado por outro médico");
    }

    var medico = new Medico(dados);
    repository.save(medico);
    var uri = uriComponentsBuilder.path("/medicos/{id}").buildAndExpand(medico.getId()).toUri();
    return ResponseEntity.created(uri).body(new DadosDetalhamentoMedico(medico));
}

E agora estou tentando fazer retornar uma lista em JSON com todos os erros pra que apareçam juntos (se colocar crm e email já existentes, no caso).

Mas agora essa parte já foi, pelo menos :)