【问题标题】:Map List<String> with Mapstruct from Java POJO to Protobuf (proto3)使用 Mapstruct 从 Java POJO 映射 List<String> 到 Protobuf (proto3)
【发布时间】:2018-12-27 06:06:47
【问题描述】:

我正在尝试将一些 POJO 从 Java 映射到 Protobuf (proto3)。其中一些包含列表。虽然使用 POJO(例如 List)映射列表没有问题,但我得到了 UnsupportedOperationException。

List&lt;Product&gt; 的示例(这工作正确):

ProductProtobuf.Builder map(Product product);

@Mapping(target = "productsList", source = "products")
ResponseProtobuf.Builder map(Response response);

List&lt;String&gt; 的示例(这不起作用):

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

【问题讨论】:

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


    【解决方案1】:

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

    简而言之,您需要添加:

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

    到您的映射器。

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

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

    【讨论】:

    • 我忘记写我已经用过的了:@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) 这个问题只发生在 List 因为 MapStruct 会创建一个 ProtocolStringList 类型的对象(而不是 String),这是一个接口,因此无法使用。
    • 您能否使用此信息更新您的问题。我会用修复更新答案
    • 从 Protobuf 到 Java POJO 怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多