2017-10-07 24 views
0

鉴于以下的原定义:扩展在proto3

syntax = "proto3"; 

import "google/protobuf/descriptor.proto"; 

option java_package = "com.example.dto"; 

option java_multiple_files = true; 

extend google.protobuf.FieldOptions { 
    Projector projector = 50002; 
} 

message Projector { 
    string name = 1; 
    string class = 2; 
    bool default = 3; 
} 

message SearchRequest { 
    string query = 1 [(projector) = {name: "queryProjector", class: "foobar"}]; 
    int32 page_number = 2; 
    int32 result_per_page = 3; 
} 

我怎样才能访问域扩张?

据我了解扩展仍然在proto3中工作,但通常被替换为Any类型?

我来了,因为这远:

final Descriptors.Descriptor descriptor = SearchRequest.getDescriptor(); 

final Descriptors.FieldDescriptor query = descriptor.findFieldByName("query"); 

这是正确的方式?下一步是什么?

回答

0

如这里指出https://github.com/google/protobuf/issues/1460

自定义选项仍然支持。这是您可以在proto3中使用扩展的唯一地方。它的工作方式与proto2中的相同。不支持proto2的语言可能会提供一个特殊的API来访问自定义选项,因为它们不支持扩展。

所以定制选项似乎仍然支持,你应该使用

descriptor.findFieldByName("query").getOptions().getAllFields(); 

,将返回你地图上您的自定义选项(如域)

final Map<Descriptors.FieldDescriptor, Object> allFields; 

而让他们价值将是你的选择,在你的情况下,投影机的类型。

此自定义选项(投影仪)的FileDescriptor似乎是以* .proto文件命名的类中使用其camelCase名称生成的公共静态。

如果原文件被称为search_service_v1.proto你可能会直接找到自定义选项,如下所示:

final DescriptorProtos.FieldOptions options descriptor.findFieldByName("query").getOptions(); 
final Object field = options.getField(SearchServiceV1.projector.getDescriptor()); 

你会通过

final Projector projector = Projector.class.cast(field); 
让您的扩展