我可以在Spring Rest方法中混合媒体类型吗?

Nep*_*s76 10 java rest spring spring-mvc

我目前正在尝试编写一个接受文件上传的ReST方法.当用户提交文件时,我还希望他们添加描述以及关于文件内容的一些其他元数据(例如,与文件内容相关联的"类型").我正在使用Spring 4的Spring MVC Controller.

这是我想要做的一个例子:

@RequestMapping(value = "/file", method = RequestMethod.POST)
public @ResponseBody
ResponseEntity<MyFileDTO> uploadCustomAnnotationFile(
        @RequestParam("file") MultipartFile uploadFile,
        @RequestBody MyFileDetailsDTO fileDetails) {
    log.debug("This is working!");
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试通过Swagger UI调用此方法,则会得到不受支持的媒体类型异常:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarycAbgNBTQ09GQTBif' not supported
Run Code Online (Sandbox Code Playgroud)

我怀疑我不能在1个请求中混合application/json和multipart/form-data?

更新:基于zeroflagL的响应并遵循提供的链接到特定于我正在尝试做的文档,并使用@RequestPart而不是@RequestBody,我取得了很小的进展,但这仍然不是工作.

新方法签名:

@RequestMapping(value = "/file", method = RequestMethod.POST)
public @ResponseBody
ResponseEntity<MyFileDTO> uploadCustomAnnotationFile(
        @RequestPart MultipartFile uploadFile,
        @RequestPart MyFileDetailsDTO fileDetails) {
    log.debug("This is working!");
}
Run Code Online (Sandbox Code Playgroud)

新例外:

2014-12-11 09:21:45.237 [http-nio-8443-exec-8] ERROR c.i.h.c.ControllerExceptionHandler   [ControllerExceptionHandler.groovy:58] - Controller Exception
org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'fileDetails' is not present.
Run Code Online (Sandbox Code Playgroud)

托尼亚,提前谢谢

a b*_*ver 1

Spring 文档明确解释了要做什么。

混合 application/json 和 multipart/form-data 的想法是错误的,因为application/json这将是多部分(原文如此!)请求的一部分。

WebKitFormBoundary让我认为您尝试从浏览器发送 AJAX 请求,我想知道您是否真的发送 JSON。AFAIK 不可能像 Spring 文档中所示那样显式添加(真正的)JSON 部分。也许您可以向我们展示客户端代码。

无论如何你不能使用@RequestBody,因为这将包含你想要上传的文件。你必须使用@RequestPart. 如果您将表单数据(而不是 JSON)与文件一起发送,那么您根本不需要任何注释。