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

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);
}

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

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

1 curtida

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

É 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.

1 curtida

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?

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>

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