Pede para incluir Bean em em construtor. Alguém pode me ajudar?

7 respostas
spring-boot
PJManzano

Olá gente.
Estou aqui, separando a entidade do DTO, porém, no arquivo de mapeamento que estou utilizando o mapStruct oSpring está me informando erro.Já tentei localizar de todo o jeito, inclusive analisando outros arquivos que utilizam o mapstruct e nada.
Alguém pode me ajudar a achar este erro (que acredito ser muito simples).

Segue o erro abaixo:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in br.com.pjem.banco.service.ClientesService required a bean of type 'br.com.pjem.banco.mapper.MapaDeCliente' that could not be found.

Action:

Consider defining a bean of type 'br.com.pjem.banco.mapper.MapaDeCliente' in your configuration.

Abaixo os arquivos:

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "clientes")
public class Clientes {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idCliente;

    @Column(nullable = false)
    private String nome;

    @Column(nullable = false, unique = true)
    private String cpf;

    @Column(nullable = false)
    private String endereco;

    private int numero;

    private String complemento;

    @Column(nullable = false)
    private String bairro;

    @Column(nullable = false)
    private String cidade;

    @Column(nullable = false)
    private String uf;

    private String telefone;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private float rendimento;

    private Date cadastro;

    @OneToMany(mappedBy = "clientes", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST})
    private List<Contas> contas = new ArrayList<>();

    public void setConta(List<ContasDTO> conta) {
    }

}

Aqui o DTO:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.br.CPF;
import org.springframework.boot.convert.DataSizeUnit;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClientesDTO  implements Serializable {

    private Long idCliente;

    @NotNull
    @Size(min=3, max = 250)
    private String nome;

    @NotNull
    @CPF
    private String cpf;

    @NotNull
    @Size(min=3, max = 200)
    private String endereco;


    @Size(max = 5)
    private int numero;


    @Size(max = 150)
    private String complemento;

    @NotNull
    @Size(min=3, max = 100)
    private String bairro;

    @NotNull
    @Size(min=3, max = 150)
    private String cidade;

    @NotNull
    @Size(min=2, max = 2)
    private String uf;

    @Size(min=10, max = 11)
    private String telefone;

    @NotNull
    @Email
    @Size(max = 250)
    private String email;

    @NotNull
    @Size(min=3, max = 8)
    private float rendimento;

    @NotNull
    @DateTimeFormat
    private Date cadastro;

    @Valid
    @NotEmpty
    private List<ContasDTO> contas;

    public void setContas(Object contas) {
    }
}

Aqui o arquivo mapper:

import br.com.pjem.banco.dto.ClientesDTO;
import br.com.pjem.banco.entity.Clientes;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper (componentModel = "spring")
public interface MapaDeCliente {

    MapaDeCliente INSTANCE = Mappers.getMapper(MapaDeCliente.class);
    Clientes paraEntidade (ClientesDTO clientesDTO);
    ClientesDTO paraDTO (Clientes clientes);
}

7 Respostas

Lucas_Camara

Parece que falta um @Component na classe MapaDeCliente, para que o Spring consiga gerenciar essa classe.

staroski

Não é necessário anotar o mapper com @Component.

Provavelmente ele não adicionou o mapstruct-processor e o lombok-mapstruct-binding no annotationProcessorPaths do pom.xml

Lucas_Camara

Sabia não. Isso é alguma lib integrada ao ciclo de vida do Spring?

Jonathan_Medeiros

É uma lib para mapear objetos, assim como o ModelMapper e algumas outras que existem, com o MapStruct você só precisa criar uma interface com os métodos que farão o de/para e ela gera a implementação, e quando é formecido o parâmetro “spring” no componentModel da anotação @Mapper, a classe de implementação gerada vem com a anotação @Component para se tornar um bean gerenciado pelo Spring.

PJManzano

Olá Lucas, Staroski e Jonathan.
Obrigado pelos retornos.
Com relação a anotação @Component, já tinha visto algo assim. Só não tinha uma explicação mais detalhada do porque.
Com relação aos lançamentos no pom.xml, lancei o mapstruct-processor, porém o lombok não está assim explicito. está da seguinte forma:

<annotationProcessorPaths>
	<path>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>${lombok.version}</version>
	</path>
	<path>
		<groupId>org.mapstruct</groupId>
		<artifactId>mapstruct-processor</artifactId>
		<version>1.4.2.Final</version>
	</path>
</annotationProcessorPaths>

Está errado desta forma?

staroski

Não está errado, mas recomendo você setar propriedades pras versões das suas bibliotecas, fica mais fácil de atualizar as versões.

Tem que adicionar também esse aqui:

<path>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-mapstruct-binding</artifactId>
    <version>0.2.0</version>
</path>
PJManzano

Olá gente. Desculpa a demora.
Inseri a anotação @Component no arquivo MapaDeCliente e resolveu normalmente.
Obrigado

Criado 6 de abril de 2022
Ultima resposta 13 de abr. de 2022
Respostas 7
Participantes 4