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

Unable to locate constructor for embeddable 'med.voll.api.endereco.Endereco'

Existe no forum uma pergunta parecida como essa, mas ele utilizava o eclipse!!! Olá, o erro acontece tanto com a versão do Java 17 ou 21 (baixo as dependencias em ambas versoes), estou utilizando o intellij !!!! A minha solução foi criar um construtor padrao em Endereço, desta forma funciona, inseri no BD... tudo blz!!!! Ai vem pergunta/afirmação.: Não deveria ser necessário criar um construtor, pois o lombok deveria gerar!!!! não é isso???? Essa é minha dúvida!!!!

package med.voll.api.medico;

import org.springframework.data.jpa.repository.JpaRepository;

public interface MedicoRepository extends JpaRepository<Medico, Long> {
}
package med.voll.api.controller;

import med.voll.api.endereco.Endereco;
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.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
    public void cadastrar(@RequestBody DadosCadastroMedico dados) {
        repository.save(new Medico(dados));

  }
}
package med.voll.api.medico;

import jakarta.persistence.*;
import med.voll.api.endereco.Endereco;

@Table(name = "medicos")
@Entity(name = "Medico")
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;

public class Endereco {

    private String logradouro;
    private String bairro;
    private String cep;
    private String numero;
    private String complemento;
    private String cidade;
    private String uf;

    public Endereco(){
    }

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

    }
}
1 resposta
solução!

Sim, não precisa criar manualmente, mas precisa indicar ao Lombok para criar. No caso da classe Endereco, você pode apagar o contrutor e adicionar a anotação @NoArgsConstructor, dessa forma:

@NoArgsConstructor
public class Endereco {
}

Se quiser pode apagar todos os construtores, pois dá pra gertar um construtor que recebe todos os atributos da classe com a anotação @AllArgsConstructor, assim você combina as duas anotações e terá os dois construtores que precisa.

O Lombok tem outras anotações muito úteis também: https://projectlombok.org/features/

Uma das mais legais é a anotação @Builder, que implementa o padrão de projeto Builder sobre uma classe e te poupa de criar um builder à parte para aquela classe, muito útil para testes.