[SWAGGER 2 UI]:启用多部分/表单数据请求

问题描述

我有一个简单的控制器方法,可以捕获一些 JSON 信息以及任意数量上传图像文件

@PostMapping(value = "/products",consumes = MediaType.MULTIPART_FORM_DATA_VALUE )
public ResponseEntity<ResponseMessage> postProduct(@RequestPart(name = "request") final MyJsonBody postRequest,@RequestPart(name = "images") final ist<multipartfile> images)
{
    log.info("Request id and name fields: " + postRequest.getProductId() + "," + postRequest.getProductName() + ".");
    log.info("Received a total of: " + images.size()  + " files.");
    return success("Just wanted to test the upload functionality!",null,HttpStatus.OK);   // A private method I have to return an appropriate ResponseEntity<> to the user.
}

MyJsonBody 类是一个用于测试目的的简单 POJO:

@Data
@Builder(access = PUBLIC)
@AllArgsConstructor
@NoArgsConstructor
public class MyJsonBody
{
    @JsonProperty("id") private String productId;
    @JsonProperty("name") private String productName;
}

使用 Postman 时,我的示例 multipart/form-data POST 请求工作正常:

My Postman request structure

正如您在此处看到的,Springboot 完全可以处理请求并按预期打印数据:

2020-12-21 14:28:20.321  INFO 11176 --- [nio-8080-exec-3] c.j.r.fileuploads.FileUploadController   : Request id and name fields: RANDOM_ID,null.
2020-12-21 14:28:20.321  INFO 11176 --- [nio-8080-exec-3] c.j.r.fileuploads.FileUploadController   : Received a total of: 2 files.

我的团队使用 Swagger 2,能够使用 Swagger UI 调试 API 对我来说很重要。不幸的是,当从 UI 发送相同的请求时:

Swagger request structure

用户界面似乎不是将请求作为 multipart/form-data 请求发送,而是作为 application/octet-stream 请求发送:

2020-12-21 14:27:40.095  WARN 11176 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported]

网络上的大多数信息都与 OpenAPI 规范版本 3 相关,但我们目前使用的是版本 2.8。 关于我可能如何使请求格式错误的任何想法?

编辑:以下是我的 Swagger 配置类。我在这个玩具项目中的所有代码都在包 com.jason.rest.fileuploads 下。

@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select().apis(RequestHandlerSelectors.basePackage("com.jason.rest.fileuploads"))
                .paths(PathSelectors.any())
                .build();
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/meta-inf/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/meta-inf/resources/webjars/");
    }

    @Bean
    public Linkdiscoverers discoverers() {
        List<Linkdiscoverer> plugins = new ArrayList<>();
        plugins.add(new CollectionjsonLinkdiscoverer());
        return new Linkdiscoverers(SimplePluginRegistry.create(plugins));

    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)