Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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.util.Map中转换google.protobuf.Struct字段<;字符串,对象>;?_Java_Spring_Spring Boot_Grpc_Proto - Fatal编程技术网

如何在java.util.Map中转换google.protobuf.Struct字段<;字符串,对象>;?

如何在java.util.Map中转换google.protobuf.Struct字段<;字符串,对象>;?,java,spring,spring-boot,grpc,proto,Java,Spring,Spring Boot,Grpc,Proto,我有一个消息定义的QUOTE_item.proto文件,它有一个google.protobuf.Struct字段来解析元数据JSON message QuotationItemEntry { // Other fields google.protobuf.Struct metadata = 15; } 元数据字段也在Java实体类中定义 public class QuotationItem { // Other entity fields private Map

我有一个消息定义的QUOTE_item.proto文件,它有一个google.protobuf.Struct字段来解析元数据JSON

message QuotationItemEntry {
    // Other fields
    google.protobuf.Struct metadata = 15;
}
元数据字段也在Java实体类中定义

public class QuotationItem {
    // Other entity fields
    private Map<String, Object> metadata;
}
公共类QuotationItem{
//其他实体字段
私有地图元数据;
}

我想使用spring boot应用程序存储gRPC请求中传递的QuotationItemEntry对象,但无法将
google.protobuf.Struct
字段转换为
java.util.Map

,在java中,
google.protobuf.Struct
的字段值在其本机表示中不受支持。相反,它们由
com.google.protobuf.Value
包装。因此,使用
google.protobuf.Struct#getFieldsMap()
方法,结果是一个
Map
。您需要手动填充条目值。

在Java中,
google.protobuf.Struct
的字段值在其本机表示形式中不受支持。相反,它们由
com.google.protobuf.Value
包装。因此,使用
google.protobuf.Struct#getFieldsMap()
方法,结果是一个
Map
。您需要手动填充条目值。

我认为您可以通过元数据键进行流式处理,并将它们收集为映射。这可以解决你的问题

    public Map<String, String> getMetadataMap(Metadata metadata) {
            Map<String, String> metadataMap = metadata.keys().stream().collect(
                Collectors.toMap(
                    key -> key,
                    key -> metadata.get(Metadata.Key.of(key,
                                        Metadata.ASCII_STRING_MARSHALLER))));
            return metadataMap;
          }
公共映射getMetadataMap(元数据){ Map metadataMap=metadata.keys().stream().collect( 汤姆( 键->键, key->metadata.get(metadata.key.of(key, Metadata.ASCII_STRING_MARSHALLER)); 返回元数据映射; }
我认为您可以对元数据键进行流式处理,并将它们收集为地图。这可以解决你的问题

    public Map<String, String> getMetadataMap(Metadata metadata) {
            Map<String, String> metadataMap = metadata.keys().stream().collect(
                Collectors.toMap(
                    key -> key,
                    key -> metadata.get(Metadata.Key.of(key,
                                        Metadata.ASCII_STRING_MARSHALLER))));
            return metadataMap;
          }
公共映射getMetadataMap(元数据){ Map metadataMap=metadata.keys().stream().collect( 汤姆( 键->键, key->metadata.get(metadata.key.of(key, Metadata.ASCII_STRING_MARSHALLER)); 返回元数据映射; }