将元数据添加到proto3 for Java中的字段

时间:2017-10-25 11:22:18

标签: grpc grpc-java proto3

Proto3已经过简化,不再支持requiredoptional字段(请参阅Why required and optional is removed in Protocol Buffers 3)。还有办法将某个字段标记为required吗? 我调查了FieldOptions,尝试过这样的事情:

message MyMeta {
  bool isRequired = 1;
}

extend google.protobuf.FieldOptions {
   MyMeta meta = 1234;
}

message Person {
  string name = 1 [ (meta) = { isRequired: true }];
  string address = 2  [ (meta) = { isRequired: true }];
  string remarks = 3;
}

将其编译成Java代码后,当我检查已编译的Java代码时,我没有看到字段与我在proto中指定的元数据之间的任何链接。我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

经过一些修修并使用@Eric Anderson关于使用原型反射的想法,这里有一种从MyMeta字段中检索Person.name的方法:

    Descriptor rootDesc = PersonProto.getDescriptor();
    FieldDescriptor name = rootDesc.findFieldByName("name");
    FieldDescriptor ext = rootDesc.getFile().getExtensions().get(0);
    MyMeta meta = (MyMeta) name.getOptions().getField(ext);
    boolean isReq = meta.getIsRequired();

答案 1 :(得分:1)

不,该功能已被删除;而是使用文档。如果您尝试将FieldOptions用于自己的扩展,那么您可以创建自己的protoc插件来生成补充代码(如验证实用程序)或在运行时使用proto反射(通过FooMessage.getDescriptor()Descriptors.FieldDescriptor.getOptions()爪哇)。