java - Map List<String> with Mapstruct 从 Java POJO 到 Protobuf (proto3)

标签 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();
}

最佳答案

问题是 MapStruct 将使用 getProductsList().addAll()。为了避免这种情况,您应该使用 CollectionMappingStrategy.ADDER_PREFERRED collectionMappingStrategy。看看 UserMapper来自 mapstruct-protobuf3在 mapstruct 示例 repo 中。

简而言之,您需要添加:

@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)

给你的映射器。

关于您的构建器的一个信息,如果您使用的是 1.3.0.Beta1,则您将不需要它,因为现在 MapStruct 中提供了开箱即用的支持。

注意:有一个 bug在无法与 ProtocolStringList 一起正常工作的 MapStruct 中。此错误已在 1.3.0.Beta1 中修复。如果您尝试使用此版本,它应该可以工作(如果您的 productListString)

关于java - Map List<String> with Mapstruct 从 Java POJO 到 Protobuf (proto3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416941/

相关文章:

c++ - 某处的远程调用框架和纯虚方法

c# - 从 C# 读取 protobuf3 自定义选项

java - map 结构Java : property to list

mapping - 如何使用 MapStruct 1.2 有条件地映射属性?

java - JMS 消息传递实现

java - 如何让 ImageView 填满屏幕的整个宽度?

java - Android - 未处理的 java.net.MalformedURLException

java - struts2 中没有调用操作类的方法

c# - "An item with the same key has already been added"protobuf-net 错误

java - 使用相同输入类型的多个子映射器