我正在尝试将一些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);
此外,我还有一些用于构建器的Mapper:
public ResponseProtobuf.Builder responseBuilder() {
return ResponseProtobuf.newBuilder();
}
public ProductProtobuf build(ProductProtobuf.Builder builder) {
return builder.build();
}
答案 0 :(得分:2)
问题在于MapStruct将使用getProductsList().addAll()
。为了避免这种情况,您应该使用CollectionMappingStrategy.ADDER_PREFERRED
collectionMappingStrategy
。看看mapstruct示例存储库中UserMapper
中的mapstruct-protobuf3。
简而言之,您需要添加:
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
到您的映射器。
关于构建器的一个信息,如果您正在使用1.3.0.Beta1,则不需要它,因为现在MapStruct中已经提供了对它的开箱即用支持。
注意:MapStruct中有一个bug无法与ProtocolStringList
一起正常使用。此错误已在1.3.0.Beta1中修复。如果您尝试使用此版本,则该版本应该可以正常工作(如果您的productList
是String
)