从Java POJO到Protobuf(proto3)使用Mapstruct映射列表<string>

时间:2018-07-19 07:38:04

标签: java protocol-buffers mapstruct proto3 protobuf-java

我正在尝试将一些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();
}

1 个答案:

答案 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中修复。如果您尝试使用此版本,则该版本应该可以正常工作(如果您的productListString