Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] - Constructor for embeddable

Olá pessoal, minha dúvida é que quando envio a requisição para a api, recebo o retorno abaixo:

"timestamp": "2024-06-03T18:32:47.678+00:00",
"status": 500,
"error": "Internal Server Error",
"trace": "org.springframework.orm.jpa.JpaSystemException: Unable to locate constructor for embeddable 'acai.tech.api.endereco.Endereco'\r\n\tat org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.

Segue a minha classe endereço:

package tech.api.endereco;

import jakarta.persistence.Embeddable;

// Minha classe endereco
@Embeddable
public class Endereco {
        
    //Inicio dos atributos
    private int numero;
    private String complemento; 
    private String bairro;
    private String cidade; 
    private String estado; 
    private int cep;
    private String endereco;
    // Final dos atributos
    
    // Inicio do construtor
    public Endereco(DadosCadastroEndereco dados) 
    {
        this.numero=dados.numero();
        this.complemento=dados.complemento();
        this.bairro=dados.bairro();
        this.cidade=dados.cidade();
        this.estado=dados.estado();
        this.cep=dados.cep();
        this.endereco=dados.endereco();
    }
    // Final do construtor

    // Inicio dos getters e setters
    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public int getCep() {
        return cep;
    }

    public void setCep(int cep) {
        this.cep = cep;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }
    
    // Final dos getters e setters
    
}

Essa é a minha classe cliente (médico):

package tech.api.cliente;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import acai.tech.api.endereco.Endereco;

// Essa e a minha classe cliente
// Essa classe do java esta sendo mapeada no banco na tabela da linha abaixo.
@Table(name="cliente")
@Entity(name="Clientes")
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Cliente
{
    
    // Inicio dos atributos
    
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String nome;
    private String email;
    private long telefone; 
    private long cpf;
    
    @Embedded
    private Endereco endereco;
    //Final dos atributos
    
    // Inicio do construtor
    public Cliente(DadosCadastroCliente dados) 
    {
        
        this.nome=dados.nome_completo();
        this.email=dados.email();
        this.telefone=dados.telefone();
        this.cpf=dados.cpf();
        this.endereco=new Endereco(dados.logradouro());
                
            
    }
    // Final do construtor
    
    // Inicio dos getters e setters
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public long getTelefone() {
        return telefone;
    }

    public void setTelefone(long telefone) {
        this.telefone = telefone;
    }

    public long getCpf() {
        return cpf;
    }

    public void setCpf(long cpf) {
        this.cpf = cpf;
    }

    public Endereco getInfos_endereco() {
        return endereco;
    }

    public void setInfos_endereco(Endereco infos_endereco) {
        this.endereco = infos_endereco;
    }
    
    //Final dos getters e setters
    
}

Já tentei algumas soluções aqui do fórum mas não consegui chegar do outro lado. Estou utilizando o eclipse.

1 resposta
solução!

A JPA exige que você ceda um construtor padrão (sem argumentos) para a classe Endereco, pois ela utiliza de reflexão para instanciar as entidades, e para isso é necessário um construtor sem argumentos. Por padrão, toda classe já possui um construtor sem argumentos de forma implicita, mas quando você declara algum construtor na sua classe, esse construtor implicito deixa de existir, sendo necessário você declara-lo explicitamente. Basta declara-lo na classe Endereco, antes ou depois do outro construtor:

public Endereco(){}