如何在Java中获取protobuf自定义选项的值?

如何在Java中获取protobuf自定义选项的值?,java,protocol-buffers,protobuf-java,Java,Protocol Buffers,Protobuf Java,背景:我正在写一个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 =

背景:我正在写一个
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";
尝试遵循,以下(在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\u包
Java\u外部类名
选项:

serverName = proto.getOptions()?.getExtension(com.example.proto.options.ServerOptionsProto.server)?.name
此外,由于这是由
protoc
插件处理的,因此需要按照以下方式注册扩展:


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

我希望我能给你镀金或做些什么。我在网上搜索,试图找出为什么我的代码生成器没有看到我添加的扩展,最后在8个小时的碰壁后,我发现了这个宝石。A++为你的“还…”添加了这个让我开心的答案。你的评论让我开心:-)谢谢!
final registry = ExtensionRegistry.newInstance();
registry.add(ServerOptionsProto.server)
final request = PluginProtos.CodeGeneratorRequest.parseFrom(input, registry)