MapStruct 绑定到有getter和Builder类的类的问题。

问题描述 投票:3回答:1

我在我的项目中使用MapStruct作为一个绑定框架,我面临着绑定对象的问题。

下面是我的LibraryResponse类。

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类。

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对象。

下面是我的mapper类,但是由于MapStruct试图找到构建者类的变量,所以无法工作。我收到编译警告 "Unmapped target properties: withVar1,withVar2...withVar20"。

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

如果我使用下面的mapper类(或者)如果我从APIResponse中删除Builder类方法并使用上面的mapper类,mapper编译得很好。

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

但是我不想写20行代码。有什么办法让MapStruct使用getters而不是Builder类?

java binding lombok mapstruct
1个回答
0
投票

创建一个Mapstruct Mapper,它不在目标类型上使用构建器方法来创建mapper方法。

NonBuilderMapperConfig.java

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

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

现在扩展你想要的mapper上的wither。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.