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