Spring REST @RequestMapping 采用多种媒体类型

Spring REST @RequestMapping taking multiple media types

我正在使用 Spring 开发 REST API,并希望 API 处理具有不同媒体类型的 POST 请求,即 JSON 请求正文中的表单数据,或通过请求发送的 JSON 文件。

所以当我有两个带有此类签名的独立方法时都可以正常工作,

@RequestMapping(value = "/configuration" , method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public String setConfiguration(@RequestPart MultipartFile file)
@RequestMapping(value = "/configuration" , method = RequestMethod.POST, consumes = {MediaType.APPLICATION_JSON_VALUE}
public String setConfiguration(@RequestBody Configuration configuration)

这两种方式的处理逻辑几乎是一样的,所以我尝试用一​​种方式吸收两种数据格式,代码如下:

@RequestMapping(value = "/configuration" , method = RequestMethod.POST, consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
public String setConfiguration(@RequestPart MultipartFile file, @RequestBody Configuration configuration)

然而,将返回一个错误响应,

{"timestamp": 1443744180124,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.web.multipart.MultipartException",
  "message": "The current request is not a multipart request",
  "path": "/v1/testconfiguration"
}

想知道我是否对 REST 的媒体类型有一些基本的误解,如果这是可行的,我怎样才能用 Spring 实现它?

如果它们都作为单独的方法工作,那么您最好只这样做。

它可能更整洁、更容易阅读,没有必要像你现在所做的那样尝试进行优化,并不是说我不花时间编写自己的代码。

虽然问这个问题已经4年多了,但为以后遇到同类问题的人提供答案。

由于在这两种情况下 Request Method 都是 POST,因此可以使用 @PostMapping 代替 @RequestMapping

使用 @PostMapping 可以有多个 MediaType。例如,下面的代码应该不会引起任何问题。

@PostMapping(value = "/configuration", consumes = { MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE })
public String setConfiguration(@RequestPart MultipartFile file, @RequestBody Configuration configuration)

注意:由于方法参数不同,@Mhowell 的方法似乎是正确的。