HttpMediaTypeNotAcceptableException升级到Spring 3.2后(

2019-08-04 03:59发布

升级我的Spring MVC应用到Spring 3.2后访问一些我的网址的时候,我发现了以下情况除外:

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不接受。

我已经成功地创建我无法访问URL的简化控制器:

@RequestMapping(value = "/resources/foo.js", produces = "text/javascript")
@ResponseBody
public String foo() throws Exception {
    return "";
}

由于我使用的是其中有一个正常的浏览器*/*Accept -header,我不明白为什么我应该得到一个HTTP 406是什么让这个更奇怪的是,这个代码工作与Spring 3.1.2,但不使用Spring 3.2。 这是为什么?

Answer 1:

已经有涉及到如何一些变化春天确实在3.2内容的谈判 。 其中一个变化是,谈判的内容现在可以基于URL的文件后缀来完成。 此功能默认情况下启用。 在Spring之前的版本3.2的HTTP接受头被用于内容的谈判。 当浏览器访问的网址内容协商是很少的问题,因为浏览器总是发送Accept:(...)*/*

Spring有地图后缀=>媒体类型。 对于“的.js”默认介质类型是‘应用程序/ x-的javascript’。 当春天试图查找处理程序映射请求/resources/foo.js,它不会匹配您的foo() -方法,因为它产生了错误的媒体类型。

我不知道,如果春节团队已经通过这种情况下想。 这至少是有点怪,它可以让你创建一个@RequestMapping不能被访问(因为.js文件的媒体类型,什么是设置在生产领域之间的不兼容)。

有修复此问题的几种方法。 之一是改变产生参数为“应用程序/ x-的javascript”。 另一个办法是改变“的.js”到‘文/ JavaScript的’(媒体类型看看如何做到这一点的文档 )。 第三种可能性是关闭基于后缀内容的谈判(再次, 查看如何做到这一点的文档 )。



Answer 2:

我现在得到它通过禁止媒体类型的基础上,请求的路径的延伸得到工作。 这可以通过应做到以下几点:

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
    <property name="favorPathExtension" value="false" />
</bean>

并指定版本3.2所有的XSD架构位置。



Answer 3:

你需要一个适当的添加MessageConverter到您的配置,有一个你可能已经对杰克逊一起。

例如,在你的子类WebMvcConfigurerAdapter

@Override
public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {
    converters.add(new StringHttpMessageConverter());
}

当你仍然保持favorPathExtension选项打开,你将不需要produces参数,以及,控制器将返回application/javascript

在Aleksanders的提示其实答案没有帮助我摆脱406的时候我有同样的问题。



Answer 4:

我有其他地方调用该控制器具有包含.AU路径值路径变量类似的问题。 春天是读书.AU为文件扩展因春天内容协商

REST GET调用 的http://本地主机:8080/api/forgot-password/kk@kudeta.com.au由于.AU路径可变弹簧抛出org.springframework.web.HttpMediaTypeNotAcceptableException

我们已经通过关闭基于内容协商解决它

@Configuration
public class ContentNegotiationConfig extends WebMvcConfigurerAdapter{
    @Override
    public void configureContentNegotiation(final 
     ContentNegotiationConfigurer configurer) {
        // Turn off suffix-based content negotiation
        configurer.favorPathExtension(false);
    }

}


文章来源: HttpMediaTypeNotAcceptableException after upgrading to Spring 3.2