Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
地图列表<;字符串>;使用从Java POJO到Protobuf(proto3)的Mapstruct_Java_Protocol Buffers_Mapstruct_Proto3_Protobuf Java - Fatal编程技术网

地图列表<;字符串>;使用从Java POJO到Protobuf(proto3)的Mapstruct

地图列表<;字符串>;使用从Java POJO到Protobuf(proto3)的Mapstruct,java,protocol-buffers,mapstruct,proto3,protobuf-java,Java,Protocol Buffers,Mapstruct,Proto3,Protobuf Java,我正在尝试将一些POJO从Java映射到Protobuf(proto3)。其中一些包含列表。虽然用POJO映射列表(例如List)没有问题,但我得到了一个不支持的操作异常 带有列表的示例(此操作正确): 带有列表的示例(这不起作用): 此外,我还有一些用于生成器的映射器: public ResponseProtobuf.Builder responseBuilder() { return ResponseProtobuf.newBuilder(); } public ProductPr

我正在尝试将一些POJO从Java映射到Protobuf(proto3)。其中一些包含列表。虽然用POJO映射列表(例如List)没有问题,但我得到了一个不支持的操作异常

带有
列表的示例(此操作正确):

带有
列表的示例(这不起作用):

此外,我还有一些用于生成器的映射器:

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

public ProductProtobuf build(ProductProtobuf.Builder builder) {
    return builder.build();
}

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

简而言之,您需要添加:

@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
给你的地图绘制者

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


注意:MapStruct中存在一个无法正确使用
ProtocolStringList
的错误。此错误已在1.3.0.Beta1中修复。如果您尝试使用此版本,它应该可以工作(如果您的
产品列表是
字符串

我忘了写我已经使用过的:
@Mapper(collectionMappingStrategy=collectionMappingStrategy.ADDER\u首选,nullValueCheckStrategy=nullValueCheckStrategy.ALWAYS)
此问题仅在列表中出现,因为MapStruct将创建ProtocolStringList(而不是String)类型的对象,这是一个接口,因此无法使用。请使用此信息更新您的问题。我会用补丁更新答案,从Protobuf到javapojo怎么样?
public ResponseProtobuf.Builder responseBuilder() {
    return ResponseProtobuf.newBuilder();
}

public ProductProtobuf build(ProductProtobuf.Builder builder) {
    return builder.build();
}
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)