Проблема с представлением данных формы и возвращением массива байтов в 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
необходимы. Но я думаю, это зависит от варианта использования.