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

时间:2017-08-30 23:08:00

标签: 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 = "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中访问自定义选项值的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

需要使用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)

答案 1 :(得分:-1)

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