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 ]

48 голосов
/ 26 августа 2011

Убедитесь, что в вашем XML-файле Spring есть следующее:

<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 должны иметь геттеры / сеттеры. Надеюсь, это поможет

21 голосов
/ 26 января 2016

От: 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)

Проблема [3] довольно сложна: сервер приложений выполняет некоторое согласование контента и убеждает Spring , что браузер запросил "application / x-msdownload" контент, несмотря на это в запросе браузера фактически нигде нет.

Решением является указание менеджера согласования контента для контекста веб-приложения:

<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>
19 голосов
/ 27 декабря 2011

Убедитесь, что вы добавили обе банки Джексона в classpath:

  • ДЖЕКСОН-ядро-ASL-x.jar
  • ДЖЕКСОН-картограф-ASL-x.jar

Кроме того, в вашем XML-файле Spring должно быть следующее:

<mvc:annotation-driven />
10 голосов
/ 24 марта 2017

Поскольку это первое попадание Google для «HttpMediaTypeNotAcceptableException», я хотел бы добавить еще одну проблему, с которой я столкнулся, что также привело к HttpMediaTypeNotAcceptableException.

В моем случае это был контроллер, который "производит", например ::1003

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

потому что я хотел обслужить файл XML. В то же время я использую класс с @ControllerAdvice для перехвата исключений, например если запрошенный файл не был найден. Обработчик исключений возвращал JSON, чтобы клиентское (угловое) приложение могло отображать сообщение об ошибке где-то в SPA.

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

produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}

Надеюсь, это поможет кому-то еще. : -)

10 голосов
/ 02 мая 2013

Просто важно помнить: версии Spring до 3.1.2 совместимы с 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.

Более подробную информацию о проблемах совместимости можно найти по этой ссылке: Примечания Джексона, игнорируемые весной

6 голосов
/ 12 декабря 2017

в моем случае favourPathExtension (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
}

}

4 голосов
/ 11 мая 2015

В вашем 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");

}

И ошибка исчезнет.

2 голосов
/ 09 мая 2017

У меня была та же проблема, но я понял, что в основном то, что происходит, когда Spring пытается отобразить ответ, попытается его сериализовать в соответствии с указанным вами типом носителя и с помощью методов getter и setter в вашем классе.

до того, как мой класс выглядел так, как показано ниже

public class MyRestResponse{
    private String message;
}

решение выглядит ниже

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

вот таку меня это сработало

1 голос
/ 08 февраля 2018

Попробуйте добавить банки "jackson-databind" в pom.xml

`<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.databind-version}</version>
</dependency>`

и produces ={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE} в @ RequestMapping

Es.@RequestMapping(value = "/api/xxx/{akey}/{md5}", produces ={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE} @RequestMapping(value = "/api/contrassegno/{akey}/{md5}", produces ={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},...

0 голосов
/ 06 июля 2019

Для меня проблемой был URL, к которому я пытался получить доступ.У меня был такой URL:

{{ip}}:{{port}}/{{path}}/person.html

Когда вы заканчиваете URL с помощью .html, это означает, что вы не примете никакой другой полезной нагрузки, кроме html.Мне нужно было удалить .html с конца, чтобы моя конечная точка работала правильно.(Вы также можете добавить .json в конце URL, и он тоже будет работать)

Кроме того, ваш URL-шаблон в web.xml должен быть правильно настроен, чтобы вы могли получить доступ к ресурсу.Для меня это

<servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

Ранее у меня было *.html*, и это мешало мне получить доступ к конечной точке.

...