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

ERRO 500 ao receber a requisição de cadastro do médico

Estou recebendo a seguinte mensagem de erro ao executar a requisição de cadastro de médico:

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

o log:

2023-07-24T12:24:20.415-03:00 ERROR 16752 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Unable to locate constructor for embeddable : med.voll.api.endereco.Endereco] with root cause

org.hibernate.InstantiationException: Unable to locate constructor for embeddable : med.voll.api.endereco.Endereco
    at org.hibernate.metamodel.internal.EmbeddableInstantiatorPojoStandard.instantiate(EmbeddableInstantiatorPojoStandard.java:58) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
    at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:513) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]

O build funciona normalmente. Lembrando que estou utilizando a IDE Eclipse Version: 2023-06 (4.28.0)

4 respostas
package med.voll.api.medico;

import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.endereco.Endereco;

@Table(name="medicos")
@Entity(name="Medico")
@Getter //lombok
@NoArgsConstructor //lombok
@AllArgsConstructor //lombok
@EqualsAndHashCode( of = "id")//lombok
public class Medico {
    @Id @GeneratedValue( strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    private String crm;

    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;

    @Embedded
    private Endereco endereco;

    public Medico(DadosCadastroMedico dados) {
        
        this.nome = dados.nome();
        this.email = dados.email();
        this.crm = dados.crm();
        this.especialidade = dados.especialidade();
        
        this.endereco = new Endereco(dados.endereco());

    }

}

package med.voll.api.endereco;


import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;


@Getter 
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class Endereco {
    private String logradouro;
    private String numero;
    private String complemento;
    private String bairro;
    private String cidade;
    private String cep;
    private String uf;

    public Endereco (DadosEndereco dados) {
        this.logradouro = dados.logradouro();
        this.numero = dados.numero();
        this.complemento = dados.complemento();
        this.bairro = dados.bairro();
        this.cidade = dados.cidade();
        this.uf = dados.uf();
        this.cep = dados.cep();

    }

}

Quando criei um construtor vazio na classe endereço, esse problema sumiu e apareceu o erro que paramos na aula 06:

java.sql.SQLSyntaxErrorException: Table 'vollmed_api.medicos' doesn't exist
Talvez o Lombok não esteja funcionando bem. Como verifica isso?

Classe Endereco com o construtor vazio.

package med.voll.api.endereco;


import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;


@Getter 
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class Endereco {
    private String logradouro;
    private String numero;
    private String complemento;
    private String bairro;
    private String cidade;
    private String cep;
    private String uf;


    public Endereco() {
        
    }
    
    public Endereco (DadosEndereco dados) {
        this.logradouro = dados.logradouro();
        this.numero = dados.numero();
        this.complemento = dados.complemento();
        this.bairro = dados.bairro();
        this.cidade = dados.cidade();
        this.uf = dados.uf();
        this.cep = dados.cep();

    }

}

Oi!

Você provavelmente não está utilizando o IntelliJ e sim o Eclipse como IDE. No Eclipse o Lombok não vem instalado automaticamente, precisando ser instalado.

Tem outros tópicos aqui no fórum mostrando como instalar o Lombok no Eclipse.

solução!

Isso mesmo, Rodrigo! Obrigado pela atenção.

Segue abaixo o link para instalação do Lombok no Eclipse: https://cursos.alura.com.br/forum/topico-instalando-o-lombok-no-eclipse-256231