Как записать асинхронные данные в удаленную конечную точку, не получив сообщения «Не найдено подходящее средство записи не найдено»? - PullRequest
1 голос
/ 02 мая 2019

У меня есть следующий метод контроллера:

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, path = "/upload")
public Mono<SomeResponse> saveEnhanced(@RequestPart("file") Mono<FilePart> file) {
    return documentService.save(file);
}

, который вызывает сервисный метод, в котором я пытаюсь использовать WebClient для помещения некоторых данных в другое приложение:

public Mono<SomeResponse> save(Mono<FilePart> file) {
    MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
    bodyBuilder.asyncPart("file", file, FilePart.class);
    bodyBuilder.part("identifiers", "some static content");
    return WebClient.create("some-url").put()
            .uri("/remote-path")
            .syncBody(bodyBuilder.build())
            .retrieve()
            .bodyToMono(SomeResponse.class);

}

но я получаю ошибку:

org.springframework.core.codec.CodecException: No suitable writer found for part: file

Я перепробовал все варианты MultipartBodyBuilder (part, asyncpart, с или без заголовков) и не могу заставить его работать.

Я неправильно это использую, чего мне не хватает?

С уважением, Alex

1 Ответ

1 голос
/ 09 мая 2019

Я нашел решение после получения ответа от одного из участников раздела о проблемах Spring Framework Github. Для этого нужно:

Метод asyncPart ожидает фактического содержимого, то есть file.content (). Я обновлю его, чтобы автоматически разворачивать содержимое детали.

bodyBuilder.asyncPart("file", file.content(), DataBuffer.class)
    .headers(h -> {
        h.setContentDispositionFormData("file", file.name());
        h.setContentType(file.headers().getContentType());
    });

Если оба заголовка не установлены, то запрос на удаленной стороне не будет выполнен, сказав, что он не может найти часть формы.

Удачи всем, кто в этом нуждается!

...