A resposta do POST esta retornando erro 500. O que pode ser?
A resposta do POST esta retornando erro 500. O que pode ser?
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.
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.
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
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