Spring MVC - HttpMediaTypeNotAcceptableException

RKo*_*dla 43 spring json spring-mvc spring-json

当与Spring MVC和JSON一起使用时,我一直收到AJAX请求的HttpMediaTypeNotAcceptableException错误.错误的完整堆栈跟踪是..

 org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:1032)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:972)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:921)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:438)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:863)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:851)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:756)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Run Code Online (Sandbox Code Playgroud)

我做的小google搜索显示请求应该包含类似"accept:application/json"的东西,它确实有..这里是来自firebug的请求标头..

Response Headers
Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  2503
Date    Thu, 25 Aug 2011 21:00:05 GMT
Connection  close

Request Headers
Host    localhost:8080
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 (.NET CLR 3.5.30729)
Accept  application/json, text/javascript, */*; q=0.01
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/legaldirectory/index.html
Cookie  JSESSIONID=5C97DA19AED4D5FA17F4A58470FAA93B
Run Code Online (Sandbox Code Playgroud)

现在我完全迷失在这里发生的事情......这里还有什么可能出错来解决这个错误......

dan*_*nik 48

请确保您的Spring xml文件中包含以下内容:

<context:annotation-config/> 

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="jacksonMessageConverter"/>
  </list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)

你的POJO的所有项目都应该有getter/setter.希望能帮助到你

  • 我的结果对象中缺少getter (6认同)
  • 从Spring 4+开始,你只需要添加<context:annotation-config />,不再需要额外的bean来使用JSON了. (3认同)

小智 22

来自:http: //georgovassilis.blogspot.ca/2015/10/spring-mvc-rest-controller-says-406.html

你有这个Spring @RestController并映射了一个包含电子邮件的URL作为URL路径的一部分.你狡猾地解决了点截断问题[1],你准备好了.突然,在某些URL上,Spring将返回406 [2],表示浏览器请求某种内容类型,而Spring无法序列化对该内容类型的响应.关键是,你已经做了多年的Spring应用程序,你做了所有的MVC声明,你包括杰克逊,基本上你被卡住了.更糟糕的是,它只会在URL路径中的某些电子邮件中吐出该错误,最明显的是那些以".com"域结尾的电子邮件.

@RequestMapping(value = "/agenda/{email:.+}", method = RequestMethod.GET)
public List<AgendaEntryDTO> checkAgenda(@PathVariable("email") String email)
Run Code Online (Sandbox Code Playgroud)

问题[3]非常棘手:应用服务器执行一些内容协商并说服Spring浏览器请求"application/x-msdownload"内容,尽管浏览器实际提交的请求中没有发生这种情况.

解决方案是为Web应用程序上下文指定内容协商管理器:

<mvc:annotation-driven enable-matrix-variables="true"
    content-negotiation-manager="contentNegotiationManager" />
<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="defaultContentType" value="application/json" />
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="false" />
    <property name="parameterName" value="mediaType" />
    <property name="ignoreAcceptHeader" value="false" />
    <property name="useJaf" value="false" />
</bean>
Run Code Online (Sandbox Code Playgroud)


小智 19

确保将两个Jackson jar添加到classpath:

  • 杰克逊核心ASL-x.jar
  • 杰克逊映射器-ASL-x.jar

此外,您必须在Spring xml文件中包含以下内容:

<mvc:annotation-driven />
Run Code Online (Sandbox Code Playgroud)

  • 对于 spring4.x 来说情况并非如此。就我而言,我所需要的只是 getter 和 setter。 (2认同)

and*_*eas 11

因为这是第一个针对"HttpMediaTypeNotAcceptableException"的谷歌搜索,我想添加另一个我偶然发现的问题,这也导致了HttpMediaTypeNotAcceptableException.

在我的例子中,它是一个指定"生产"的控制器,例如:

@RequestMapping(path = "/mypath/{filename}", method = RequestMethod.GET,
        produces = { MediaType.APPLICATION_XML_VALUE }
Run Code Online (Sandbox Code Playgroud)

因为我想提供一个XML文件.同时我使用带有"@ControllerAdvice"的类来捕获异常,例如,如果找不到所请求的文件.异常处理程序返回JSON,因此客户端(角度)应用程序可以在SPA中的某处显示错误消息.

现在控制器想要返回XML,但Exception Handler返回JSON,因此引发了HttpMediaTypeNotAcceptableException.我通过添加JSON尽可能"生成"值来解决这个问题:

produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人.:-)


Eri*_*son 10

需要记住的重要事项:3.1.2之前的Spring版本与JACKSON 1.x兼容,而不与JACKSON 2.x兼容.这是因为从JACKSON 1.x到2.x,类的包名被更改了.在JACKSON中,1.x类在org.codehaus.jackson下,而在JACKSON 2.x中,它们在com.fasterxml.jackson下.

为了解决这个问题,从Spring 3.1.2开始,他们添加了一个新的MappingJackson2HttpMessageConverter来替换MappingJacksonHttpMessageConverter.

您可以在此链接中找到有关兼容性问题的更多详细信息:在Spring中忽略Jackson注释


pan*_*ser 7

在我的情况下,favorPathExtension(false)帮助了我

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer
            .setUseSuffixPatternMatch(false);  // to use special character in path variables, for example, `email@dom.com`
}

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer
            .favorPathExtension(false); // to  avoid HttpMediaTypeNotAcceptableException on standalone tomcat
}
Run Code Online (Sandbox Code Playgroud)

}


zyg*_*tus 5

在扩展WebMvcConfigurerAdapter的 Spring @Configuration类中,覆盖方法configureMessageConverters,例如:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    // http
    HttpMessageConverter converter = new StringHttpMessageConverter();
    converters.add(converter);
    logger.info("HttpMessageConverter added");

    // string
    converter = new FormHttpMessageConverter();
    converters.add(converter);
    logger.info("FormHttpMessageConverter added");

    // json
    converter = new MappingJackson2HttpMessageConverter();
    converters.add(converter);
    logger.info("MappingJackson2HttpMessageConverter added");

}
Run Code Online (Sandbox Code Playgroud)

错误将消失。