Solucionado (ver solução)
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