StackOverflowError при чтении файла из реактивной GridFS - PullRequest
0 голосов
/ 11 октября 2019

У меня проблема с ReactiveGridFsTemplate. Я пытаюсь прочитать файл GridFS, написанный со старой GridFS (com.mongodb.gridfs) вместо новой GridFS (com.mongodb.client.gridfs.model.GridFS) с UUID в качестве идентификатора вместо ObjectId. Чтение файла GridFS у metainfo идет хорошо, но как только я хочу получить ReactiveGridFsResource, он выдвигается с новым замечательным MongoGridFSException («Пользовательский тип идентификатора, используемый для этого файла GridFS»).

Причиной является код нижеиз ReactiveGridFsTemplate, которая вызывает getObjectId () вместо getId (). Должен ли он вызывать этот метод или его можно переписать в метод getId ()?

    public Mono<ReactiveGridFsResource> getResource(GridFSFile file) {
        Assert.notNull(file, "GridFSFile must not be null!");
        return Mono.fromSupplier(() -> {
            GridFSDownloadStream stream = this.getGridFs().openDownloadStream(file.getObjectId());
            return new ReactiveGridFsResource(file, BinaryStreamAdapters.toPublisher(stream, this.dataBufferFactory));
        });
    }

Я взломал ReactiveGridFsTemplate, чтобы использовать getId () вместо getObjectId (), но теперь он дает мне исключение stackoverflow. Может кто-нибудь сказать мне, что я делаю не так?

        ReactiveGridFsTemplate reactiveGridFsTemplate = new ReactiveGridFsTemplate(mongoDbDFactory, operations.getConverter(), "nl.loxia.collectie.buitenlandbladen.dgn", 1024) {
            public Mono<ReactiveGridFsResource> getResource(GridFSFile file) {
                Assert.notNull(file, "GridFSFile must not be null!");
                return Mono.fromSupplier(() -> {
                    GridFSDownloadStream stream = this.getGridFs().openDownloadStream(file.getId());
                    return new ReactiveGridFsResource(file, BinaryStreamAdapters.toPublisher(stream, this.dataBufferFactory));
                });
            }            
        };

        var q = Query.query((Criteria.where("_id").is("5449d9e3-7f6d-47b7-957d-056842f190f7")));

        List<DataBuffer> block = reactiveGridFsTemplate
                .findOne(q)
                .flatMap(reactiveGridFsTemplate::getResource)
                .flux()
                .flatMap(ReactiveGridFsResource::getDownloadStream)
                .collectList()
                .block();

Stacktrace: https://gist.github.com/nickstolwijk/fa77681572db1d91941d85f6c845f2f4

Кроме того, этот код зависает из-за исключения stackoverflow. Это правильно?

...