1

我有以下一段代码,

@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。

4

2 回答 2

3

对于文件格式,规范中的非类型字节。你应该发送type: string, format: binary.

因此,您的 post 方法的 requestBody 是正确的。

要描述 POST 方法返回的字节类型数组,可以添加以下描述:

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

于 2020-08-02T12:58:36.630 回答
1

上周我也遇到了同样的问题。我的解决方案是通过 SpringDocUtils 将返回类型 byte-Array 替换为 String:

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 表示替换,因此不需要相应的显式注释 via @ApiResponse。但我认为这取决于用例。

于 2020-08-17T10:15:09.767 回答