如何在Spring Boot中指定回退请求映射

时间:2017-05-16 15:44:12

标签: java spring spring-mvc spring-boot

我们有一个端点可以根据Accept标头返回不同的响应。特别是,它可以返回zip文件,视频文件或音频文件。

映射1:

@RequestMapping(value = "endpoint",
        method = RequestMethod.GET,
        produces = {"video/*", "audio/*"})

Mappping 2:

@RequestMapping(value = "endpoint",
        method = RequestMethod.GET, produces = {"application/zip", "*/*"})

此设置将采用Accept: video/*并转到映射1(这是我们想要的)。但是,Accept: video/mp4会导致java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path例外。

我原本期望video/mp4更接近地匹配映射1并加载它。确实,这正是我们想要的。

我们可以删除*/*,然后Accept: video/mp4会转到映射1.但是,我们需要*/*转到映射2.

为什么没有Accept: video/mp4匹配映射1,因为这是一个更接近的匹配?

如果没有其他接受标头更接近匹配,我们是否可以将此端点配置为使用默认方法?然后我们可以让映射1只声明它产生application/zip

我们正在使用Spring Boot 1.5.3。

1 个答案:

答案 0 :(得分:1)

为什么不一起删除produces并在方法中生成Content-Type,并且还具有if条件来测试Accepts请求标头?您可以根据请求标头调用两种不同的方法。

@RequestMapping(value = "endpoint", method = RequestMethod.GET)
public void doIt(HttpServletRequest request, HttpServletResponse response) {
  if (request.getHeader("Accept").matches("application/zip"))
    doZip();
  else
    doVideo();