Mapper não retorna a bean

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.

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>

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

Vou tentar.

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.

1 curtida

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

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

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.

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

image

Você usa Eclipse também ou outra?

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?

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.

Qual seu sistema operacional?

Windows 10

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

Update:

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

Mas gente! kk

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

1 curtida