将 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]
(...)
此异常会导致 HTTP 406 NOT ACCEPTABLE。
我已经成功创建了一个简化的控制器,其 URL 无法访问:
@RequestMapping(value = "/resources/foo.js", produces = "text/javascript")
@ResponseBody
public String foo() throws Exception {
return "";
}
因为我使用的是普通浏览器*/*
in the Accept
-header,我不明白为什么我应该得到 HTTP 406。更奇怪的是,这段代码适用于 Spring 3.1.2,但不适用于 Spring 3.2。这是为什么?
与如何进行相关的一些变化Spring 在 3.2 中进行内容协商 http://static.springsource.org/spring-framework/docs/3.2.x/spring-framework-reference/html/new-in-3.2.html#new-in-3.2-webmvc-content-negotiation。这些更改之一是现在可以根据 URL 中的文件后缀完成内容协商。该功能默认启用。在 3.2 之前的 Spring 版本中,HTTP 接受标头用于内容协商。当浏览器访问您的 URL 时,内容协商很少成为问题,因为浏览器总是发送Accept:(...)*/*
.
Spring有一个后缀=>媒体类型的映射。对于“.js”,默认媒体类型是“application/x-javascript”。当 Spring 尝试查找 /resources/foo.js 请求的处理程序映射时,它将与您的不匹配foo()
- 方法,因为它产生错误的媒体类型。
我不确定Spring团队是否考虑过这个案例。至少有点奇怪的是它让你创建一个@RequestMapping
无法访问(因为 .js-media 类型与 Produce 字段中设置的内容不兼容)。
有多种方法可以解决此问题。一种是将 Produces-参数更改为“application/x-javascript”。另一种方法是将“.js”的媒体类型更改为“text/javascript”(请参阅如何执行此操作的文档 http://static.springsource.org/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation)。第三种可能性是关闭基于后缀的内容协商(同样,请参阅如何执行此操作的文档 http://static.springsource.org/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)