使用 getter 和 Builder classes 绑定到 class 的 MapStruct 问题

MapStruct Problem binding to a class with getter and Builder classes

我在我的项目中使用 MapStruct 作为绑定框架,但我遇到了绑定对象的问题。

下面是我的 LibraryResponse Class。

public class LibraryResponse{
  private String var1;
  private String var2;
  ...
  private String var20;
  //Setters and Getters for the 20 varibles using Lombok. These are auto generated
}

下面是我的 APIResponse Class。

public class APIResponse{
  private String var1;
  private String var2;
  ...
  private String var20;
  //Setters and Getters for the 20 varibles. These are auto generated

  public static Builder builder() { // Auto generated builder class
      return new Builder();
  }
  public static class Builder { // These are auto generated as well
    private String var1;
    private String var2;
    ...
    private String var20;
    public Builder withVar1(String var1) {
      this.var1 = var1;
      return this;
    }
    ...
    public Builder withVar20(String var20) {
      this.var20= var20;
      return this;
    }
  }
}

我想将 LibraryResponse 对象绑定到 APIResponse 对象。

以下是我的映射器 class,但这不起作用,因为 MapStruct 正在尝试查找构建器 class 的变量。我收到编译警告 "Unmapped target properties: withVar1,withVar2....withVar20"

@Mapper
interface APIMapper {
  APIResponse mapLibraryToAPI(LibraryResponse source);
}

如果我使用下面的映射器 class,则映射器编译正常(或者)如果我从 APIResponse 中删除 Builder class/methods 并使用上面的映射器 class。

@Mapper
interface APIMapper {
  @Mapping(target="withVar1",source="var1")
  ...
  @Mapping(target="withVar20",source="var20")
  APIResponse mapLibraryToAPI(LibraryResponse source);
}

但是我不想写20行代码。有什么方法可以告诉 MapStruct 使用 getter 而不是 Builder class?

创建一个不在目标类型上使用构建器方法的 Mapstruct 映射器来创建映射器方法。

NonBuilderMapperConfig.java

import org.mapstruct.Builder;
import org.mapstruct.MapperConfig;

@MapperConfig(builder = @Builder(disableBuilder = true))
public interface NonBuilderMapperConfig {
}

现在扩展你想要凋零的映射器。

@Mapper(config = NonBuilderMapperConfig.class)
public interface APIMapper{

//Now all withers will be binded automatically
APIResponse mapLibraryToAPI(LibraryResponse source);
}

如果您根本不想在您的项目中使用 Builder,并且您只在您的项目中绑定 @Wither,您可以通过在您的项目中创建一个值为 org.mapstruct.ap.spi.NoOpBuilderProvider 的文件 META-INF/services/org.mapstruct.ap.spi.BuilderProvider 来禁用 Builder项目。参考 Documentation 了解更多详情