Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
13
respostas

Lombok- IntelliJ

Dei uma olhada em outros tópicos, mas ainda não consegui utilizar o Lombok. Rodei sem o construtor padrão e não persistia nem Médico e nem Paciente. Coloquei a tag @AllArgsConstructor antes das demais como sugerida pela Beatriz Diegues Duarte e mudou o erro, passou a reclamar do construtor do Endereço, com o erro:

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

Dei uma pesquisada e vi uma sugestão no stack overflow e chatGPT de colocar a descrição "(force = true)" na frente da anotação @NoArgsConstructor Ainda assim não funcionou, mas pelo pelo pude criar o construtor padrão sem que a IDE indicasse erro. O que entendo que não deveria ser necessário pelo uso do Lombok. Foi necessário criar apenas para Endereço, pois medico e paciente gerava sem o construtor padrão. Imaginei que era por ser embeddable.

Segui. Mais pra frente, ao buscar todos os médicos ou pacientes não gerou os getters, tive que fazer na mão pra finalizar o curso, e depois, mesmo com os getters gerados. Dava esse erro:

2024-12-05T16:36:22.585-03:00 ERROR 34429 --- [api] [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: No default constructor for entity 'med.voll.api.paciente.Paciente'] with root cause

org.hibernate.InstantiationException: No default constructor for entity 'med.voll.api.paciente.Paciente'
    at org.hibernate.metamodel.internal.EntityInstantiatorPojoStandard.instantiate(EntityInstantiatorPojoStandard.java:93) ~[hibernate-core-6.6.2.Final.jar:6.6.2.Final]

Tive que fazer os construtores na mão de médico e paciente, porém a IDE mostrava erro e tive que adicionar a descrição "(force = true)" na frente da anotação "@NoArgsConstructor"

Sabendo que deve ser algum erro do Lombok fui ver o arquivo pom.

Tinha esse trecho na parte do build:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

Comentei a seguinte parte de exclusão:

<!--<configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
      </configuration>-->

Dentro das minhas dependências esta assim:

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
</dependency>

Já dei build > rebuild project

E ja dei File > Invalidade caches > Invalidade and restart

13 respostas

OBS: Rodrigo, se for gravar aula nova, mostre mais seu gato!!! s2

Oi Jil!

Dá uma olhadinha nesse tópico para ver se é o mesmo caso que o seu: https://cursos.alura.com.br/forum/topico-no-construtor-os-gets-estao-em-vermelho-pedindo-pra-criar-um-metodo-porem-na-aula-nao-tem-467215?hasAccessMGM=true

Uma foto recente do Leopoldo =':'=

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

Ola Rodrigo, joia? Apelou com essa foto linda do Leopoldo!!!

Até é o mesmo problema mas não a mesma raiz, rs. Meu plugin já esta instalado, acha que pode ser a versão? Ou a tag provided dentro de application.properties?

Lista dos plugins instalados e gerenciados pelo maven

screenshot do Lombok instalado e enabled

Minha gata Mia julgando meu código e meu gosto musical... Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Fofinha a Mia :D

Então no seu caso o Lombok já está ok no IntelliJ.

Manda aqui o código completo das suas classes Paciente e Endereco

Tentei retirar os getter e os construtores padrão e rodar pra te mandar o erro, mas nem sobe a applicação. Erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Entity Paciente:

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.domain.endereco.Endereco;

@Entity(name = "Paciente")
@Table(name = "pacientes")
@AllArgsConstructor
@NoArgsConstructor
//@NoArgsConstructor(force = true)
@Getter
@EqualsAndHashCode(of = "id")
public class Paciente {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    private String telefone;
    private String cpf;
    @Embedded
    private Endereco endereco;
    private Boolean ativo;

    public Paciente(DadosCadastroPaciente dados) {
        this.ativo = true;
        this.nome = dados.nome();
        this.email = dados.email();
        this.telefone = dados.telefone();
        this.cpf = dados.cpf();
        this.endereco = new Endereco(dados.endereco());
    }

    public void atualizarInfo(DadosAtualizacaoPaciente dadosPaciente) {
        if (dadosPaciente.nome() != null) {
            this.nome = dadosPaciente.nome();
        }
        if (dadosPaciente.telefone() != null) {
            this.telefone = dadosPaciente.telefone();
        }
        if (dadosPaciente.endereco() != null) {
            this.endereco.atualizarInformacoes(dadosPaciente.endereco());
        }
    }

    public void inativar() {
        this.ativo = false;
    }
}

Entity Endereço

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

@Embeddable
@Getter
@AllArgsConstructor
@NoArgsConstructor
//@NoArgsConstructor(force = true)
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(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();
    }

    public void atualizarInformacoes(DadosEndereco dadosEndereco) {
        if (dadosEndereco.logradouro() != null) {
            this.logradouro = dadosEndereco.logradouro();
        }
        if (dadosEndereco.bairro() != null) {
            this.bairro = dadosEndereco.bairro();
        }
        if (dadosEndereco.cep() != null) {
            this.cep = dadosEndereco.cep();
        }
        if (dadosEndereco.uf() != null) {
            this.uf = dadosEndereco.uf();
        }
        if (dadosEndereco.cidade() != null) {
            this.cidade = dadosEndereco.cidade();
        }
        if (dadosEndereco.numero() != null) {
            this.numero = dadosEndereco.numero();
        }
        if (dadosEndereco.complemento() != null) {
            this.complemento = dadosEndereco.complemento();
        }
    }

    @Override
    public String toString() {
        return "Endereco{" +
                "logradouro='" + logradouro + '\'' +
                ", bairro='" + bairro + '\'' +
                ", cep='" + cep + '\'' +
                ", numero='" + numero + '\'' +
                ", complemento='" + complemento + '\'' +
                ", cidade='" + cidade + '\'' +
                ", uf='" + uf + '\'' +
                '}';
    }
}

Como ele reclamava do getId() inseri apenas os getter 'na mão' e rodei, ao criar um paciente dá esse erro: org.hibernate.InstantiationException: Unable to locate constructor for embeddable 'med.voll.api.domain.endereco.Endereco'

Então inseri 'na mão' o construtor sem arg: public Endereco() {} A IDE deu erro, então adicionei a descrição (force = true) na frente da annotation @NoArgsConstructor Criou o paciente, mas quando rodo um getPaciente da esse erro: Bytecode enhancement failed because no public, protected or package-private default constructor was found for entity: med.voll.api.domain.paciente.Paciente. Private constructors don't work with runtime proxies

Então Então inseri 'na mão' o construtor sem arg: public Paciente() {} A IDE deu erro, então adicionei a descrição (force = true) na frente da annotation @NoArgsConstructor E ai cria e faz o get, mas ão traz o endereço, então adicionei os getter 'na mão' no model Endereo e dai tudo certo.

Mas a ideia do lombok é não ter que inserir né? O q estou errando? Quer que mande o código com os getters e constutores padrão?

O código está certinho sim.

O problema é algo relacionado com o Lombok no seu IntelliJ mesmo, que parece não estar funcionando e por isso os getters e construtores não estão sendo gerados.

Tenta fechar o projeto do intelliJ, fechar o Intellij e então abrir e importar novamente o projeto para ver se resolve.

Nao funcionou Rodrigo :'( cry

Acha q tento criar um novo projeto no spring do zero?

Verifica algumas configurações no seu IntelliJ:

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 acessibilidade

Essas configs estão todas "ticadas" =/

Muito estranho então. Tenta desinstalar o IntelliJ e instalar a versão mais recente: https://www.jetbrains.com/idea/download/download-thanks.html?platform=windows&code=IIC

solução!

Rodrigo, me desculpe... Achei aqui! Eram os repositories no arquivo .pom Alias, a falta deles, ao criar direto pelo start.spring.io não veio esse trecho do arquivo, e como os demais projetos do curso tbm não tinha, achei que poderia manter sem.

Adicionei esse trecho após o e rodou tudo normal mesmo extraindo os construtores padrões e gettes feitos 'na mão':

<repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestones</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestones</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

Eu e Mia agradecemos! Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Ah que bom que resolveu então :)

Bons estudos! =':'=