Добавить метаданные к полям в 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()
на Яве).