Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
13
respostas

Erro 500 no post medicos

A resposta do POST esta retornando erro 500. O que pode ser?

13 respostas

Oi Andressa!

Precisamos de mais informações para te ajudar. Posta aqui o erro que apareceu no console do Intellij e se possível um print da requisição disparada no Insomnia.

Ola, Rodrigo. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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

Bem no início da exception ele mostra o problema: Column 'especialidade' cannot be null.

O médico está sendo salvo no banco de dados sem a especialidade preenchida. Vi no seu print do Postman que esse campo está sendo enviado coretamente na requisição, então pode ser na hora de criar o objeto médico que ele não foi preenchido corretamente.

Verifica no construtor da classe médico se a especialidade está sendo preenchida.

Boa tarde Rodrigo. Segue a classe medico.

import jakarta.persistence.*;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.endereco.Endereco;

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

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

    private String telefone;

    private String crm;

    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;

    @Embedded
    private Endereco endereco;

    private Boolean ativo;

    public Medico(DadosCadastroMedico 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 Endereco(dados.endereco());
    }
}

Manda também o controller, dto e enum especialidade.

import jakarta.validation.Valid;
import med.voll.api.medico.DadosCadastroMedico;
import med.voll.api.medico.Medico;
import med.voll.api.medico.MedicoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @Autowired
    private MedicoRepository repository;

    @PostMapping
    @Transactional
    public void cadastrarMedico(@RequestBody @Valid DadosCadastroMedico dados) {
        repository.save(new Medico(dados));

    }
}
package med.voll.api.medico;

public enum Especialidade {

    ORTOPEDIA,
    CARDIOLOGIA,
    GINECOLOGIA,
    DERMATOLOGIA;
}
import jakarta.validation.Valid;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import med.voll.api.endereco.DadosEndereco;

public record DadosCadastroMedico(

        @NotBlank
        String nome,
        @NotBlank
        @Email
        String email,
        @NotBlank
        String telefone,
        @NotBlank
        @Pattern(regexp = "\\d{4,6}")
        String crm,
        @NotNull
        Especialidade especialidade,
        @NotNull
        @Valid
        DadosEndereco endereco) {

}

A princípio está tudo certo :D

Faz um teste então, altera o método no controller:

@PostMapping
@Transactional
public void cadastrarMedico(@RequestBody @Valid DadosCadastroMedico dados) {
    var medico = new Medico(dados);

    System.out.println(medico);

    repository.save(medico);
}

E adiciona mais essa anotação do Lombok na entidade Medico: @ToString

E veja no console como vai sair ao disparar a requisição.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira 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 Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

O erro está diferente agora, não mais sendo relacionado com a especialidade e sim com o atributo ativo, que não tem a coluna na tabela de médicos.

Verifica se você criou a migration que adiciona essa coluna na tabela.

Essa migration eu nao tenho

solução!

Foi explicado nessa aula: https://cursos.alura.com.br/course/spring-boot-3-desenvolva-api-rest-java/task/115971

Adicionei a mi8gration e funcionou. Fiz o POST e nao deu problema.

Muito Obrigado. Vou continuar as aulas de onde parei

Adicionei a migration e funcionou. Fiz o POST e nao deu problema.

Muito Obrigado. Vou continuar as aulas de onde parei