Ale*_*øld 9 java spring spring-mvc spring-3
将我的Spring MVC应用程序升级到Spring 3.2后,在访问我的一些URL时遇到以下异常:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:203) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:272) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:212) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:55) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:297) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1091) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1076) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:896) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) ~[spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915) [spring-webmvc-3.2.0.RELEASE.jar:3.2.0.RELEASE]
(...)
Run Code Online (Sandbox Code Playgroud)
此异常导致HTTP 406无法接受.
我设法用我无法访问的URL创建一个简化的控制器:
@RequestMapping(value = "/resources/foo.js", produces = "text/javascript")
@ResponseBody
public String foo() throws Exception {
return "";
}
Run Code Online (Sandbox Code Playgroud)
由于我使用的是其中有一个正常的浏览器*/*在Accept-header,我不明白为什么我应该得到一个HTTP 406是什么让这个更奇怪的是,这个代码工作与Spring 3.1.2,但与春3.2.这是为什么?
Ale*_*øld 10
有关Spring如何在3.2中进行内容协商的一些变化.其中一个变化是现在可以根据URL中的文件后缀完成内容协商.默认情况下启用此功能.在3.2之前的Spring版本中,HTTP accept-header用于内容协商.当浏览器访问您的URL时,内容协商很少成为问题,因为浏览器总是发送Accept:(...)*/*.
Spring有一个后缀=>媒体类型的地图.对于".js",默认媒体类型是"application/x-javascript".当Spring尝试查找对/resources/foo.js的请求的处理程序映射时,它将与您的foo()-method 不匹配,因为它会生成错误的媒体类型.
我不确定Spring团队是否考虑过这个案例.它至少有点奇怪,它允许你创建一个@RequestMapping无法访问的(因为.js-media类型与产生字段中设置的不兼容).
有几种方法可以解决这个问题.一种是将produce-parameter更改为"application/x-javascript".另一种方法是将".js"的媒体类型更改为"text/javascript"(请参阅如何操作的文档).第三种可能性是基于后缀关闭内容协商(再次,请参阅如何进行的文档).
| 归档时间: |
|
| 查看次数: |
5760 次 |
| 最近记录: |