如何在 Java 中获取 protobuf 自定义选项的值?
How to get value of protobuf custom option in 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 中访问自定义选项值的正确方法是什么?
需要使用java_package
和java_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)
我认为问题在于您的选项是文件级选项,但您正试图像访问消息级选项一样访问它。尝试 proto.getDescriptor().getFile().getOptions()
.
而不是 proto.getDescriptor().getOptions()
背景:我正在写一个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_package
和java_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)
我认为问题在于您的选项是文件级选项,但您正试图像访问消息级选项一样访问它。尝试 proto.getDescriptor().getFile().getOptions()
.
proto.getDescriptor().getOptions()