spring-boot - MapStruct 映射器返回空的映射对象

标签 spring-boot lombok mapstruct

我正在尝试使用 MapStruct 在 dto 和实体对象之间进行映射转换,但是生成的映射器实现仅返回 映射对象。
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生成 getter 和 setter,在另一边 mapstruct在你的对象中寻找 getter 和 setter 来填充它们,但在这种情况下它找不到它们仅仅是因为在编译过程中 mapstruct之前正在运行 lombok可以生成它们。
解决办法就是简单的写下lombok的配置mapstruct的配置前在您的 pom.xml 文件中首先执行 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 processor-->
      <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </path>
      <!--Maps Struct compile processor-->
      <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct-ver}</version>
      </path>
    </annotationProcessorPaths>
  </configuration>
</plugin>

关于spring-boot - MapStruct 映射器返回空的映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64689460/

相关文章:

java - 参数化测试因 mvn 测试而失败

MapStruct:在映射之前过滤列表

java - 使用 init.d 运行 SpringBoot Jar 时出错

java - 如何在 java hibernate 中将参数设置为单引号之间的 native 查询?

spring-boot - Kotlin + Spring Boot + @Valid 不工作子对象的内部对象

java - 为什么我的 swagger 不能在 java 中使用 springboot?

java - @Value 字段、Lombok 和构造函数注入(inject)的最佳实践?

java - 由 : java. lang.UnsupportedOperationException: null Lombok with List 引起

java - 如何使用 Mapstruct 克服命名冲突