Добавить метаданные к полям в proto3 для Java

Proto3 был упрощен так, что required а также optional поля больше не поддерживаются (см. раздел "Почему требуется" и "Необязательный" удален в буферах протокола 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 ответа

Решение

После небольшого переделывания и использования идеи @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();

Нет, эта функциональность была удалена; используйте документацию вместо. Если вы пытаетесь использовать FieldOptions для своих собственных расширений, то вы можете создать свой собственный плагин Protoc для генерации дополнительного кода (например, утилиты проверки) или использовать протоотражение во время выполнения (через FooMessage.getDescriptor() а также Descriptors.FieldDescriptor.getOptions() на Яве).

Другие вопросы по тегам