我在我的项目中使用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类?
创建一个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
在您的项目中。参考 文件资料 更多详情