【问题标题】:MapStruct mapper returns empty mapped objectMapStruct 映射器返回空映射对象
【发布时间】:2021-02-17 16:50:54
【问题描述】:

我正在尝试使用 MapStruct 在 dto 和实体对象之间进行映射转换,但是生成的映射器实现只返回 empty 映射对象。

BeerMapperImpl

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-11-05T07:42:21+0800",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class BeerMapperImpl implements BeerMapper {

    @Override
    public BeerDto beerToBeerDto(Beer beer) {
        if ( beer == null ) {
            return null;
        }

        BeerDto beerDto = new BeerDto();

        return beerDto;
    }
}

以下是我的代码。

pom.xml

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

.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.3.0.Final</version>
            </path>
            <path>
                <groupId>
                    org.projectlombok
                </groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </path>
        </annotationProcessorPaths>
        <compilerArgs>
            <compilerArg>
                -Amapstruct.defaultComponentModel=spring
            </compilerArg>
        </compilerArgs>
    </configuration>
</plugin>

BeerMapper.java

@Mapper(uses = {DateMapper.class})
public interface BeerMapper {
    BeerDto beerToBeerDto(Beer beer);
    Beer beerDtoToBeer(Beer dto);
}

任何人都可以帮助建议我的代码中可能出现的问题?谢谢!

【问题讨论】:

标签: spring-boot lombok mapstruct


【解决方案1】:

我已经找到了解决方案,而无需降级 Spring Boot。问题是我使用lombok 来生成getter 和setter,另一方面mapstruct 在你的对象中寻找getter 和setter 来填充它们,但在这种情况下它找不到它们只是因为在编译期间mapstructlombok 生成它们之前就已运行。

解决办法就是在你的pom.xml文件中,在mapstruct的配置之前写lombok的配置,首先执行lombok。确保运行clean compile 删除旧文件。

maven-compiler-plugin的工作配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <annotationProcessorPaths>
      <!--Project Lombok compile preprocessor-->
      <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </path>
      <!--Maps Struct compile preprocessor-->
      <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct-ver}</version>
      </path>
    </annotationProcessorPaths>
  </configuration>
</plugin>

【讨论】:

  • 完美!结合这两种技术时没有很好地描述的细节。解决了我的问题!
  • 能否为 gradle 添加解决方案
  • 完美答案!
【解决方案2】:

我遇到过类似的问题,当填充原始对象时,mapstruct 映射创建的对象中的所有值都具有空值。当我在目标中检查生成的映射器时,生成的实现不包含实际的映射。我发现当我对项目中的 Mapper 进行小幅更改并保存时,这很容易解决。目标中的映射器在映射到位的情况下重新生成。我不确定为什么映射器生成不正确,但这是一个对我有用的快速修复。

【讨论】:

    【解决方案3】:

    我删除了注解处理器路径标签并将 bot lombok 和 mapstruct 声明为依赖项。

    有类似问题的链接: MapStruct and Lombok not working together

    【讨论】:

      【解决方案4】:

      我在将 spring boot starter 从 2.3.5.RELEASE 降级到 2.1.5.RELEASE 后解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 2018-05-30
        • 2020-04-07
        相关资源
        最近更新 更多