【问题标题】:How to get value of protobuf custom option in Java?如何在 Java 中获取 protobuf 自定义选项的值?
【发布时间】:2017-09-06 03:59:14
【问题描述】:

背景:我正在写一个protoc 插件。

自定义 protobuf 选项通过以下方式实现:

syntax = "proto3";

package com.example.proto.options;

import "google/protobuf/descriptor.proto";

option java_multiple_files = true;
option java_outer_classname = "ServerOptionsProto";
option java_package = "com.example.proto.options";

extend google.protobuf.FileOptions {
    ServerOptions server = 50621;
}

message ServerOptions {
    // Java classname
    string name = 1;
}

以下是一个示例用法:

syntax = "proto3";

package com.example.testdata;

import "com/example/proto/options/server.proto";

option java_multiple_files = true;
option java_package = "com.example.testdata.protogen";
option java_outer_classname = "TestDataProto";

option (com.example.proto.options.server).name = "TestData";

尝试关注https://developers.google.com/protocol-buffers/docs/proto#options,以下(在 Groovy 中)不起作用:

request.getProtoFileList().stream().filter { proto ->
  proto.serviceCount > 0
}.flatMap { proto ->
  serverName = proto.getDescriptor().getOptions()?.getExtension(com.example.proto.options.ServerOptionsProto.server)?.name
}

Java 中访问自定义选项值的正确方法是什么?

【问题讨论】:

    标签: java protocol-buffers protobuf-java


    【解决方案1】:

    需要使用java_packagejava_outer_classname 选项:

    serverName = proto.getOptions()?.getExtension(com.example.proto.options.ServerOptionsProto.server)?.name
    

    此外,由于这是由protoc 插件处理的,因此扩展需要按照Extensions 进行注册:

    final registry = ExtensionRegistry.newInstance();
    registry.add(ServerOptionsProto.server)
    final request = PluginProtos.CodeGeneratorRequest.parseFrom(input, registry)
    

    【讨论】:

    • 我希望我能给你镀金什么的。我搜索了网络,试图弄清楚为什么我的代码生成器没有看到我添加的扩展,最后在我的头撞到墙上 8 小时后,我发现了这个宝石。 A++ 表示您的“也...”除了这个让我很开心的答案。
    • 你的评论让我很开心 :-) 谢谢!
    【解决方案2】:

    我认为问题在于您的选项是文件级选项,但您正试图访问它,就好像它是消息级选项一样。试试proto.getDescriptor().getFile().getOptions(),而不是proto.getDescriptor().getOptions()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多