swagger-ui提交请求,请求不包含name值,造成后台无法进行接受参数。
@Operation(description = "上传文件",tags = "上传") @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public BaseResponseDataVo<UploadFileModel> uploadFile(@Parameter(style = ParameterStyle.FORM,explode = Explode.TRUE) MultipartFile multipartFile){ String yearMonthDay = DateFormatUtils.format(new Date(), "yyyyMMdd"); return null; }
// 就算把@Parameter换成 @Parameter(name = "multipartFile",schema = @Schema(type = "string",format = "binary")) 也不行,使用@ApiParam也不会提交携带name属性名
//swagger的@RequestBody和spring的RequestBod依旧解决不了问题
// swagger的@RequestBody(content = @Content(mediaType = "application/octet-stream",schema = @Schema(type = "string",format = "binary",name = "file"))) 也解决不了问题
// 把@Parameter注解换成swagger1.5.X的@ApiParam(name = "multipartFile",value = "文件对象")注解,也依旧无果
说明:我指的name值就是form表单input元素的name值,没有这个值你后台接收不到的
经过多次尝试无果后,再@Parameter注解位置再添加一个 @RequestPart("file") 注解即可解决swagger提交请求无name值的问题
@RequestParam注解DOC文档翻译:
指示方法参数应绑定到Web请求参数的注释。
在Spring MVC和Spring WebFlux中支持注释的处理程序方法,如下所示:
* 在Spring MVC中,“request parameters”映射到查询参数,表单数据和多部分请求中的零件。 这是因为Servlet API将查询参数和表单数据组合到称为“parameters”的单个映射中,并且包括对请求正文(request body)的自动解析。
* 在Spring WebFlux中,“request parameters”仅映射到查询参数。 要处理所有3种查询,表单数据和多部分数据,可以将数据绑定到使用ModelAttribute注释的命令对象。
如果方法参数类型为Map并指定了请求参数名称,则假定适当的转换策略可用,请求参数值将转换为Map。
如果方法参数为Map <String,String>或MultiValueMap <String,String>并且未指定参数名称,则将使用所有请求参数名称和值填充map参数。
@RequestPart注解DOC文档翻译:
可用于将“ multipart / form-data”请求的一部分与方法参数关联的注释。
支持的方法参数类型包括MultipartFile和Spring的MultipartResolver抽象,javax.servlet.http.Part和Servlet 3.0多部分请求结合,或者对于其他任何方法参数,该部分的内容都通过HttpMessageConverter传递,并考虑到请求部分的“ Content-Type”标头。这类似于@RequestBody根据非分段常规请求的内容来解析参数的操作。
请注意,@ RequestParam批注还可用于将“ multipart / form-data”请求的一部分与支持相同方法参数类型的方法参数相关联。
主要区别在于,当方法参数不是字符串或原始MultipartFile / Part时,@ RequestParam依赖于通过注册的Converter或PropertyEditor进行的类型转换,而RequestPart则依赖于HttpMessageConverters的考虑到请求部分的“ Content-Type”标头。 RequestParam可能与名称-值表单字段一起使用,而RequestPart可能与包含更复杂内容的部分一起使用,例如JSON,XML)。