Импорт дескриптора с включенным импортом - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь загрузить дескрипторы из внешнего источника.При использовании сгенерированных файлов без импорта это работает без проблем, но когда у прототипа есть импорт, тогда при создании FileDescriptor я получаю DescriptorValidationException:

Не удалось проанализировать дескриптор ./descriptors/test.dsc com.google.protobuf.Descriptors$ DescriptorValidationException: AccessRequest.date_from: ".google.protobuf.Timestamp" не определен.

Proto-файл, который я использую для получения * .dsc-файла:

syntax = "proto3";
import "google/protobuf/timestamp.proto";
message AccessRequest {
    int64 cabinet_id = 1;
    google.protobuf.Timestamp date_from = 2;
    google.protobuf.Timestamp date_to = 3;
}

Командакоторый я использую для получения * .dsc:

protoc --include_imports --proto_path=src/main/proto/ --descriptor_set_out=descriptors/test.dsc  src/main/proto/test.proto 

Мой код для загрузки * .dsc файлов:

try (final InputStream stream = Files.newInputStream(path)) {
            final FileDescriptorSet fds = FileDescriptorSet.parseFrom(stream);

            final TypeRegistry.Builder builder = TypeRegistry.newBuilder();
            for (final FileDescriptorProto fdp : fds.getFileList()) {
                final FileDescriptor fd = FileDescriptor.buildFrom(fdp, new FileDescriptor[]{});
                builder.add(fd.getMessageTypes());
                globalBuilder.add(fd.getMessageTypes());
            }
            return new Queue(base, builder.build());
        }

1 Ответ

0 голосов
/ 08 марта 2019

FileDescriptor.buildFrom(fdp, new FileDescriptor[]{}) является ключевой точкой.Вы должны построить рекурсивную зависимость (импорт) и взять результат для замены второго параметра.Дайте вам мой код для справки

private FileDescriptor buildFileDescriptor(FileDescriptorProto currentFileProto,
                                           Map<String, FileDescriptorProto> fileProtoCache) {
    List<FileDescriptor> dependencyFileDescriptorList = new ArrayList<>();
    currentFileProto.getDependencyList().forEach(dependencyStr -> {
        FileDescriptorProto dependencyFileProto = fileProtoCache.get(dependencyStr);
        FileDescriptor dependencyFileDescriptor = buildFileDescriptor(dependencyFileProto, fileProtoCache);
        dependencyFileDescriptorList.add(dependencyFileDescriptor);
    });
    try {
        return FileDescriptor.buildFrom(currentFileProto, dependencyFileDescriptorList.toArray(new FileDescriptor[0]));
    } catch (DescriptorValidationException e) {
        throw new IllegalStateException("FileDescriptor build fail!", e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...