UnsupportedOperationException с загрузкой файлов MultiPart с использованием Webflux и Spring Boot с Google Cloud Storage - PullRequest
0 голосов
/ 19 марта 2019

При использовании альтернативы FileSystem с FilePart.transferTo я вижу UnsupportedOperationException, выброшенный во время многоэтапной загрузки файла.

Похоже, реализация SynchronossFilePart, используемая Spring, переключается на другой FileSystemProvider при обработке данных.Есть ли способ предотвратить это и заставить Spring использовать только желаемую файловую систему?

Ниже приведен фрагмент, демонстрирующий проблему использования google-cloud-nio в качестве файловой системы, которая пытается сохранить загруженный файл в google.облачное хранилище.

Я использую Spring Boot 2.1.3

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Mono<Void> multipartUpload( final @RequestPart("file") FilePart filePart
    ) {

        FileSystem fileSystem = CloudStorageFileSystem.forBucket("my-bucket");

        // Code snippet that demonstrates connectivity to GCP is okay
        //try {
        //    Files.write(fileSystem.getPath("successful-file"), "Just here to prove this works, this data is written to the bucket successfully, can be removed".getBytes());
        //} catch (IOException e) {
        //    e.printStackTrace();
        //}
        return filePart.transferTo(fileSystem.getPath("failed-file"));
    }

Соответствующая Stacktrace:

java.lang.UnsupportedOperationException: null
    at java.base/java.nio.file.spi.FileSystemProvider.newFileChannel(FileSystemProvider.java:524)
    at java.base/java.nio.channels.FileChannel.open(FileChannel.java:292)
    at java.base/java.nio.channels.FileChannel.open(FileChannel.java:345)
    at org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossFilePart.transferTo(SynchronossPartHttpMessageReader.java:334)

1 Ответ

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

CloudStorageFileSystemProvider расширяет класс java nio FileSystemProvider, из которого происходит исключение.

CloudStorageFileSystemProvider не переопределяет метод newFileChannel и документацию по умолчаниюповедение этого класса гласит:

Требуется поставщик по умолчанию для поддержки создания файловых каналов.Если не переопределить, реализация по умолчанию выдает UnsupportedOperationException.

Это похоже на проблему с библиотекой google-cloud-nio, хотя возможно, что реализация webflux может быть улучшена, чтобы не полагаться на отсутствующие реализации издругие поставщики.

Обновление: Похоже, google-cloud-nio выпустила реализацию метода newFileChannel начиная с версии 0.88.0-alpha, которая должна решить эту проблемувыпуск

...