使用 Mapstruct 从 Java POJO 到 Protobuf (proto3) 的 Map List<String>

Lis*_*iso 5 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);
Run Code Online (Sandbox Code Playgroud)

示例List<String>(这不起作用):

@Mapping(target = "usersList", source = "users")
ResponseProtobuf.Builder map(Response response);
Run Code Online (Sandbox Code Playgroud)

另外,我有一些用于构建器的映射器:

public ResponseProtobuf.Builder responseBuilder() {
    return ResponseProtobuf.newBuilder();
}

public ProductProtobuf build(ProductProtobuf.Builder builder) {
    return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

Fil*_*lip 13

问题是 MapStruct 将使用getProductsList().addAll(). 为了避免这种情况,您应该使用CollectionMappingStrategy.ADDER_PREFERRED collectionMappingStrategy. 查看mapstruct示例存储库中的UserMappermapstruct -protobuf3

简而言之,您需要添加:

@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
Run Code Online (Sandbox Code Playgroud)

给你的映射器。

有关您的构建器的一项信息,如果您使用 1.3.0.Beta1,您将不需要它,因为 MapStruct 现在对此有开箱即用的支持。

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

  • 我忘了写我已经使用过: `@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)` 问题仅发生在 List&lt;String&gt; 上,因为 MapStruct 会创建一个 ProtocolStringList 类型的对象(而不是 String&lt;List) &gt;),这是一个接口,因此不能使用。 (3认同)