Проблема с представлением данных формы и возвращением массива байтов в Springdoc

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

@PostMapping(value = "/create/{userId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Object> saveFile(
        @Parameter(description = "ID of the user") @PathVariable(value = "userId") final String userId,
        @Parameter(description = "Avatar of the user", content = @Content(mediaType = MediaType.APPLICATION_OCTET_STREAM_VALUE)) @RequestParam(value = "avatar", required = true) final MultipartFile file
) {
    ...
}

@GetMapping(value = "/get", produces = MediaType.IMAGE_PNG_VALUE)
@ApiResponse(responseCode = "200", description = "OK", content = {@Content(array = @ArraySchema(schema = @Schema(implementation = Byte.class)))})
public ResponseEntity<byte[]> getFile() {
    ...
}

А ниже - ожидаемый и фактический результат.

Как добиться желаемого результата? Ожидаемые результаты от Springfox.

2 ответа

Решение

Для формата файла байт not в спецификации. Вы должны отправитьtype: string, format: binary.

Итак, ваш requestBody для методов публикации правильный.

Чтобы описать возврат типа массива байтов в методе POST, вы можете добавить следующее описание:

@ApiResponse(content = @Content(schema = @Schema(type = "string", format = "binary")))

На прошлой неделе я столкнулся с той же проблемой. Мое решение заключалось в замене возвращаемого типа byte-Array на String через SpringDocUtils:

import org.springframework.context.annotation.Configuration;
import org.springdoc.core.SpringDocUtils;

@Configuration
public class OpenApiConfiguration {

    static {
        SpringDocUtils.getConfig()
                        .replaceWithClass(byte[].class, String.class);
    }
}

Для меня преимущество этого подхода заключается в том, что каждый byte[] будет заменен представлением String, поэтому нет соответствующих явных аннотаций через @ApiResponseнеобходимы. Но я думаю, это зависит от варианта использования.

Другие вопросы по тегам