Spring MVC - HttpMediaTypeNotAcceptableException - PullRequest
43 голосов
/ 26 августа 2011

Я получаю эту ошибку 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)

небольшое прибегание к поиску, которое я сделал, показывает, что запрос должен содержать что-токак "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

Теперь я полностью потерян в том, что здесь происходит .. что еще может пойти не так здесьчтобы получить эту ошибку ...

Ответы [ 14 ]

0 голосов
/ 21 сентября 2018

В моем случае

 {"timestamp":1537542856089,"status":406,"error":"Not Acceptable","exception":"org.springframework.web.HttpMediaTypeNotAcceptableException","message":"Could not find acceptable representation","path":"/a/101.xml"}

было вызвано:

path = "/path/{VariableName}" но я передавал VariableName с суффиксом, например «abc.xml», который заставляет его интерпретировать .xml как некий запрос формата вместо . Смотрите ответы там.

0 голосов
/ 27 июля 2017

В моем случае просто добавьте аннотацию @ResponseBody для решения этой проблемы.

0 голосов
/ 02 июля 2016

Поскольку Alex намекнул в одном из ответов, вы можете использовать ContentNegotiationManagerFactoryBean, чтобы установить тип контента по умолчанию равным "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 {

Вместо этого я решил изменить заголовок «Принять» запроса из браузера на"application / json", тем самым заставляя SpringMVC найти мой метод.

Использование (еще не завершенного) API извлечения Javascript:

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

Et voilà!Теперь SpringMVC находит метод, проверяет форму и позволяет вернуть JSON POJO.

0 голосов
/ 13 января 2013
response.setHeader("Accept",  "application/json");
...