使用 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 了解更多详情
我在我的项目中使用 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 了解更多详情