【问题标题】:Spring REST @RequestMapping taking multiple media typesSpring REST @RequestMapping 采用多种媒体类型
【发布时间】:2015-10-02 00:17:55
【问题描述】:

我正在使用 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 来实现它?

【问题讨论】:

  • 如果你想重用逻辑,你可以让第一个方法将 MultipartFile 转换为 Configuration,然后以它作为参数调用第二个方法。所以你仍然有 2 个 POST 处理程序,但你不要重复自己。
  • @approxiblue,谢谢,看来这就是我应该做的

标签: spring rest spring-mvc media-type


【解决方案1】:

虽然问这个问题已经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 的方法似乎是正确的。

【讨论】:

    【解决方案2】:

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

    它可能更简洁,更容易阅读,没有必要像你现在所做的那样尝试进行优化,并不是说我不会为自己的代码工作。

    【讨论】:

    • 谢谢。尝试在这里了解最佳处理方式,看起来最好将具有不同媒体类型的 API 分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多