Webflux: передать файлы и DTO в один запрос - PullRequest
2 голосов
/ 11 марта 2020

Мне нужно передать оба файла (через form-data) и DTO. Поэтому я пытаюсь сделать следующее:

@PostMapping
public Mono<Void> method(@RequestPart("files") Flux<FilePart> files,
                         Dto dto) {
    return Mono.empty();
}

и инициализировать Dto через параметры для каждого поля dto.

Итак, я получаю следующую ошибку:

org.springframework.core.codec.CodecException: Type definition error: [simple type, class org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossFilePart]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossFilePart and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.LinkedHashMap["errors"]->java.util.Collections$UnmodifiableList[0]->org.springframework.validation.FieldError["rejectedValue"])
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossFilePart and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.LinkedHashMap["errors"]->java.util.Collections$UnmodifiableList[0]->org.springframework.validation.FieldError["rejectedValue"])

Изображения загружаются правильно, если я полностью удаляю параметр Dto.

Добавление аннотации @RequestBody к параметру Dto приводит к следующей ошибке:

Content type 'multipart/form-data;charset=UTF-8;boundary=rh4lsv9DycBf8hpV2snhKfRjSrj1GvHzVy' not supported for bodyType=com.example.Dto

Получено это работает путем передачи Dto как @RequestParam("dto") String dto и синтаксического анализа JSON вручную, но на самом деле это не идеальное решение.

1 Ответ

2 голосов
/ 11 марта 2020

Так что вам нужна так называемая смешанная многочастная

@PostMapping("/test")
public Mono<Void> method(@RequestPart("dto") Dto dto, @RequestPart("files") Flux<FilePart> files) {

    return Mono.empty();
}

, это работает с этим запросом http:

POST /test HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 425629ec-335f-4d49-8df4-d6130af67889

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="files"; filename="Capture.PNG"
Content-Type: image/png


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="dto"
Content-Type: application/json

{"test":"aaa"}

###

Примечание:

   Content-Type: application/json

для dto part is обязательно

См. Этот ответ:

Пружина MVC Многочастный запрос с JSON

...