Mapper não retorna a bean

16 respostas Resolvido
Olivier_Pironi

Estou usando o mapstruct, configurei ele mas o spring não reconhece a bean da classe BarbeiroMapper, vejam:

O erro:

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

Description:

Parameter 1 of method barbeiroService in br.com.seiya.barbershop.adapter.config.BeanConfiguracao required a bean of type 'br.com.seiya.barbershop.adapter.mapper.BarbeiroMapper' that could not be found.


Action:

Consider defining a bean of type 'br.com.seiya.barbershop.adapter.mapper.BarbeiroMapper' in your configuration.

BarbeiroMapper:

@Mapper(componentModel = "spring")
public abstract class BarbeiroMapper {
	
	public static final BarbeiroMapper INSTANCE = Mappers.getMapper(BarbeiroMapper.class);

	public abstract BarbeiroEntity toBarbeiroEntity(BarbeiroRequest barbeiroRequest);
	
	public abstract BarbeiroResponse toBarbeiroResponse(BarbeiroEntity barbeiroResponse);
	
}

POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.9</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>br.com.seya</groupId>
	<artifactId>barbershop</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>barbershop</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>

	 [...] outras dependencias

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		<dependency>
			<groupId>org.mapstruct</groupId>
			<artifactId>mapstruct</artifactId>
			<version>1.5.3.Final</version>
		</dependency>
	</dependencies>


	<build>
		<plugins>
			<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>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>17</source> <!-- depending on your project -->
					<target>17</target> <!-- depending on your project -->
					<annotationProcessorPaths>
						<path>
							<groupId>org.mapstruct</groupId>
							<artifactId>mapstruct-processor</artifactId>
							<version>1.5.3.Final</version>
						</path>
						<!-- other annotation processors -->
						<path>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</path>
						<path>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok-mapstruct-binding</artifactId>
							<version>0.2.0</version>
						</path>
					</annotationProcessorPaths>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Tentativas de solucionar:

Já tentei adidionar @Component no BarbeiroMapper, mesmo sabendo que deveria funcionar sem ele, porém não funcionou;

Tentei criar uma bean em uma classe de configurações de Bean, o Spring reconheceu a Bean mas não achou a implementação dela que deveria ser feita pelo mapstruct;

Informações úteis:
Minha pasta Target está vazia.

16 Respostas

wldomiciano

Eu testei aqui usando seu POM e funcionou. Experimenta dar mvn clean só pra ver.

A única coisa que fiz de diferente foi adicionar a versão do Lombok no <path>, ficou assim:

<path>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>${lombok.version}</version>
</path>
O POM inteiro
<?xml version="1.0" encoding="UTF-8"?>
<project
  xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>
    <relativePath /> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <java.version>17</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
      <groupId>org.mapstruct</groupId>
      <artifactId>mapstruct</artifactId>
      <version>1.5.3.Final</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <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>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>17</source> <!-- depending on your project -->
          <target>17</target> <!-- depending on your project -->
          <annotationProcessorPaths>
            <path>
              <groupId>org.mapstruct</groupId>
              <artifactId>mapstruct-processor</artifactId>
              <version>1.5.3.Final</version>
            </path>

            <path>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>${lombok.version}</version>
            </path>

            <path>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok-mapstruct-binding</artifactId>
              <version>0.2.0</version>
            </path>
          </annotationProcessorPaths>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
Olivier_Pironi

Cara, tentei dar clean e o rebuild n vezes e não funciona, quer dar uma olhada no meu repositório?

tenta baixar e executar ele

wldomiciano

Vou tentar.

wldomiciano
Solucao aceita

Então, testei aqui do jeitinho que veio usando o comando abaixo:

clear && mvn clean spring-boot:run

Só clonei e rodei o comando e rodou perfeitamente.

Precisei apenas subir um Postgres aqui usando Docker.

Também removi o @Component que vc tinha colocado na BarbeiroMapper e tudo funcionou perfeitamente.

wldomiciano

Vc está executando o projeto através de alguma IDE?

Olivier_Pironi

Sim, através do Eclipse.

Eu tinha tentado o mvn clear pelo terminal e o build pelo eclipse, depois startava normal e não funcionava.

Fiz exatamente o comando que vc enviou pelo terminal e deu certo.

Não entendi o porquê.

wldomiciano

Eu chuto que seja algum mecanismo de cache da IDE. Dá um clean no projeto através da IDE e tenta novamente, pra gente ver.

Olivier_Pironi

Eu tinha tentado o clear e o rebuild pela propria IDE e deu pau tbm.

image

Você usa Eclipse também ou outra?

wldomiciano

E se vc tentasse o seguinte:

  • Salva, commita e pusha qualquer alteração que vc tenha feito neste meio tempo
  • No Eclipse, exclua seu projeto, remova do disco completamente também
  • Clona seu projeto novamente e importe no Eclipse
  • Me diz o que acontece

Eu uso o VS Code com o plugin Spring Tools 4. Eu rodei seu projeto usando a linha de comando e, também, usando os recursos do plugin e funcionou normalmente.

O Eclipse que vc usa é o Spring Tool Suite ou o Eclipse normal + o plugin do Eclipse?

Olivier_Pironi

Exclui o projeto do disco e importei ele direto do github, deu o mesmo erro.

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

Description:

Parameter 1 of method barbeiroService in br.com.seiya.barbershop.adapter.config.BeanConfiguracao required a bean of type 'br.com.seiya.barbershop.adapter.mapper.BarbeiroMapper' that could not be found.


Action:

Consider defining a bean of type 'br.com.seiya.barbershop.adapter.mapper.BarbeiroMapper' in your configuration.

Eclipse normal, tenho o plugin do springtools mas na real que nem utilizo ele.

wldomiciano

Qual seu sistema operacional?

Olivier_Pironi

Windows 10

wldomiciano

Vou testar aqui pra ver se dá o mesmo erro.

Olivier_Pironi

Update:

Abri no Intelinj e startou sem problemas. Depois que eu abri no Intelij funcionou no Eclipse (?).

wldomiciano

Mas gente! kk

Olivier_Pironi

É, magia pura. Só sei que quando eu tiver um problema de build eu vou usar o comando pelo terminal igual vc passou. Não entendi mesmo o porque que só o Eclipse deu essa travada.

Criado 31 de março de 2023
Ultima resposta 31 de mar. de 2023
Respostas 16
Participantes 2