Spring MVC – HttpMediaTypeNotAcceptableException

我一直得到这个HttpMediaTypeNotAcceptableException错误的AJAX请求时使用Spring MVC和JSON ..错误的完整堆栈跟踪是..

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) 

我做了很less的search,显示请求应该包含像“接受:应用程序/ JSON”这是确实有..这里是从萤火虫的请求标题..

 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 

现在我完全失去了这里发生的事情..还有什么可以在这里出错得到错误…

请确保您的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> 

而你的POJO的所有物品都应该有获得者/设定者。 希望它有帮助

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

  • jackson核心ASL-x.jar
  • jackson映射器-ASL-x.jar

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

 <mvc:annotation-driven /> 

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

你已经有了这个Spring @RestController,并且将包含一个电子邮件的URL映射为URLpath的一部分。 你狡猾地解决了点截断问题[1],你已经准备好了。 突然间,在一些URL上, Spring将返回一个406 [2],表示浏览器请求了某种内容types, Spring不能序列化该内容types的响应。 重点是,你已经做了多年的Spring应用程序,而且你所有的MVC声明都是正确的,你包括了Jackson,基本上你被卡住了。 更糟的是,它只会在URLpath中的某些电子邮件中吐出这个错误,特别是那些以“.com”域名结尾的邮件。

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

问题[3]非常棘手:应用程序服务器执行一些内容协商,并且说服Spring浏览器请求“application / x-msdownload”内容,尽pipe浏览器实际上没有提交请求。

解决scheme是为Web应用程序上下文指定一个内容协商pipe理器:

 <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> 

只要记住一些重要的事情: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来replaceMappingJacksonHttpMessageConverter。

在这个链接中你可以find关于兼容性问题的更多细节: 在Spring中被忽略的Jackson注解

因为这是“HttpMediaTypeNotAcceptableException”的第一个谷歌命中我喜欢添加另一个问题,我偶然发现导致HttpMediaTypeNotAcceptableException也。

在我的情况下,它是一个控制器,指定“生产”,例如:

 @RequestMapping(path = "/mypath/{filename}", method = RequestMethod.GET, produces = { MediaType.APPLICATION_XML_VALUE } 

因为我想提供一个XML文件。 同时,我正在使用“@ControllerAdvice”类来捕获exception,例如,如果找不到请求的文件。 exception处理程序正在返回JSON,以便客户端(angular度)应用程序可以在SPA中的某处显示错误消息。

现在控制器想要返回XML,但exception处理程序返回JSON,所以引发了HttpMediaTypeNotAcceptableException。 我通过添加JSON尽可能“产生”值来解决这个问题:

 produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE} 

希望这可以帮助别人。 🙂

在您的Spring @Configuration类中,扩展WebMvcConfigurerAdapter覆盖方法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"); } 

而错误将会消失。

我有同样的问题,但我已经知道,基本上是什么时候弹簧试图呈现响应,它会尝试按照您指定的媒体types序列化,并在您的类中使用getter和setter方法

之前我的课上看起来像下面

 public class MyRestResponse{ private String message; } 

解决scheme如下所示

 public class MyRestResponse{ private String message; public void setMessage(String msg){ this.message = msg; } public String getMessage(){ return this.message; } } 

这是如何为我工作

正如Alex在其中一个答案中所暗示的那样,您可以使用ContentNegotiationManagerFactoryBean将默认的content-type设置为“application / json”,但我觉得这种方法不适合我。

我试图做的是发表一个表单,像这样的方法

 @RequestMapping(value = "/post/to/me", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public @ResponseBody MyJsonPOJO handlePostForm(@Valid @ModelAttribute("form") ValidateMeForm form, BindingResult bindingResult) throws ApiException { 

我select做的是将请求的“Accept”头从浏览器更改为“application / json”,从而使SpringMVCfind我的方法。

使用(尚未完成的)JavaScript Fetch API:

 var form = new FormData(); form.append("myData", "data"); let fetchConfig = { method: "POST", body: form, headers: {"Accept": "application/json"} }; fetch("/post/to/me", fetchConfig) .then(... // Javascript Promise API here 

Etvoilà! 现在SpringMVCfind方法,validation表单,并让你返回一个JSON POJO。

在我的情况下,只需添加@ResponseBody注释来解决这个问题。

 response.setHeader("Accept", "application/json");