Map List<String> with Mapstruct 从 Java POJO 到 Protobuf (proto3)
Map List<String> with Mapstruct from Java POJO to Protobuf (proto3)
我正在尝试将一些 POJO 从 Java 映射到 Protobuf (proto3)。其中一些包含列表。虽然使用 POJO(例如 List)映射列表没有问题,但我收到了 UnsupportedOperationException。
List<Product>
的示例(正确工作):
ProductProtobuf.Builder map(Product product);
@Mapping(target = "productsList", source = "products")
ResponseProtobuf.Builder map(Response response);
带有 List<String>
的示例(这不起作用):
@Mapping(target = "usersList", source = "users")
ResponseProtobuf.Builder map(Response response);
此外,我还有一些用于构建器的映射器:
public ResponseProtobuf.Builder responseBuilder() {
return ResponseProtobuf.newBuilder();
}
public ProductProtobuf build(ProductProtobuf.Builder builder) {
return builder.build();
}
问题是 MapStruct 将使用 getProductsList().addAll()
。为了避免这种情况,您应该使用 CollectionMappingStrategy.ADDER_PREFERRED
collectionMappingStrategy
。查看 mapstruct 示例回购中的 UserMapper
from the mapstruct-protobuf3。
简而言之,您需要添加:
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
给你的映射器。
关于您的构建器的一个信息,如果您使用的是 1.3.0.Beta1,则您将不需要它,因为现在 MapStruct 中有开箱即用的支持。
注意:MapStruct 中有一个 bug 无法与 ProtocolStringList
一起正常工作。此错误已在 1.3.0.Beta1 中修复。如果您尝试使用此版本,它应该可以工作(如果您的 productList
是 String
)
我正在尝试将一些 POJO 从 Java 映射到 Protobuf (proto3)。其中一些包含列表。虽然使用 POJO(例如 List)映射列表没有问题,但我收到了 UnsupportedOperationException。
List<Product>
的示例(正确工作):
ProductProtobuf.Builder map(Product product);
@Mapping(target = "productsList", source = "products")
ResponseProtobuf.Builder map(Response response);
带有 List<String>
的示例(这不起作用):
@Mapping(target = "usersList", source = "users")
ResponseProtobuf.Builder map(Response response);
此外,我还有一些用于构建器的映射器:
public ResponseProtobuf.Builder responseBuilder() {
return ResponseProtobuf.newBuilder();
}
public ProductProtobuf build(ProductProtobuf.Builder builder) {
return builder.build();
}
问题是 MapStruct 将使用 getProductsList().addAll()
。为了避免这种情况,您应该使用 CollectionMappingStrategy.ADDER_PREFERRED
collectionMappingStrategy
。查看 mapstruct 示例回购中的 UserMapper
from the mapstruct-protobuf3。
简而言之,您需要添加:
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
给你的映射器。
关于您的构建器的一个信息,如果您使用的是 1.3.0.Beta1,则您将不需要它,因为现在 MapStruct 中有开箱即用的支持。
注意:MapStruct 中有一个 bug 无法与 ProtocolStringList
一起正常工作。此错误已在 1.3.0.Beta1 中修复。如果您尝试使用此版本,它应该可以工作(如果您的 productList
是 String
)