Dav*_*d V 5 java spring spring-mvc spring-boot
我们有一个端点,可以根据Accept标头返回不同的响应.特别是,它可以返回zip文件,视频文件或音频文件.
映射1:
@RequestMapping(value = "endpoint",
method = RequestMethod.GET,
produces = {"video/*", "audio/*"})
Run Code Online (Sandbox Code Playgroud)
Mappping 2:
@RequestMapping(value = "endpoint",
method = RequestMethod.GET, produces = {"application/zip", "*/*"})
Run Code Online (Sandbox Code Playgroud)
此设置将采用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.
为什么不一起删除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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
852 次 |
| 最近记录: |