2017-08-30 145 views
0

背景:我在寫一個protoc插件。如何在Java中獲得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中)不工作

定製protobuf的選項與下面的實現:

request.getProtoFileList().stream().filter { proto -> 
    proto.serviceCount > 0 
}.flatMap { proto -> 
    serverName = proto.getDescriptor().getOptions()?.getExtension(com.example.proto.options.ServerOptionsProto.server)?.name 
} 

什麼是正確的方式在Java中訪問值的自定義選項?

回答

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

我相信問題在於你的選擇是文件級選項,但你試圖訪問它,就好像它是一個消息級選項。而不是proto.getDescriptor().getOptions(),請嘗試proto.getDescriptor().getFile().getOptions()