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 的方法似乎是正确的。
我正在使用 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 的方法似乎是正确的。