Как получить значение настраиваемой опции 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 следующее (в 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 ответа

Решение

java_package а также java_outer_classname Варианты должны быть использованы:

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

Кроме того, так как это обрабатывается protoc Плагин, расширение должно быть зарегистрировано в соответствии с расширениями:

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

Я полагаю, что проблема в том, что ваш вариант - файловый уровень, но вы пытаетесь получить к нему доступ, как если бы это был вариант на уровне сообщений. Вместо proto.getDescriptor().getOptions(), пытаться proto.getDescriptor().getFile().getOptions(),

Другие вопросы по тегам