Использование Spring REST приводит к статусу HTTP 406 - неприемлемо

Я получаю эту ошибку, когда пытаюсь использовать REST API:

Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 406 Not Acceptable

Вот исполняемый клиентский код:

public static void main(String[] args) {
   Car c = getCarById(4);
   System.out.println(c);
}

public static  @ResponseBody Car getCarById(int id){
    return new RestTemplate().getForObject("http://localhost:8080/rest/cars/{id}", Car.class, id);
}

Вот код контроллера, который отображает запрос:

@RequestMapping(value="/cars/{id}", method=RequestMethod.GET, headers = {"Accept=text/html,application/xhtml+xml,application/xml"}, produces="application/xml")
public @ResponseBody Car getCarById(@PathVariable("id") int id){
    return carService.getCarById(id);
}

Почему возникает эта ошибка (406-Not Acceptable), хотя картографы должны позаботиться о сопоставлении с правильными типами?


person ndrizza    schedule 11.07.2012    source источник
comment
добавили библиотеку Джексона сейчас - все в порядке.   -  person ndrizza    schedule 11.07.2012


Ответы (6)


Вы отправляете заголовок Accept= вместо заголовка Accept:.

person Tom van der Woerdt    schedule 11.07.2012
comment
ты прав спасибо! Я изменил его, но теперь получаю следующую ошибку: HTTP-статус 405 - метод запроса «GET» не поддерживается. Почему так происходит? - person ndrizza; 11.07.2012
comment
похоже, что метод контроллера больше не отображается. я не знаю почему. - person ndrizza; 11.07.2012
comment
теперь он работает, вот краткое изложение: - убедитесь, что у вас добавлена ​​библиотека Джексона (на стороне клиента и на стороне сервера) - не имеет значения, написано ли a = или a: - person ndrizza; 11.07.2012

Я получил этот ответ, когда в моем запросе был неправильный заголовок Accept :. Я пытался запросить изображение / jpeg, но мой запрос содержал «Accept: application / json».

Решением было использовать правильный класс сущности для запроса (я запрашивал Object, чтобы посмотреть, что будет), в моем случае Resource.class.

person koljaTM    schedule 03.12.2013

добавьте это в диспетчер Spring mvc:

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>

<!-- JSON format support for Exception -->
<bean id="methodHandlerExceptionResolver"
      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
        </list>
    </property>
</bean>
person Yura    schedule 27.08.2014

В моем случае я исправил это не на стороне сервера, а на стороне клиента. Я использовал Postman и получал ошибку 406. Но при использовании браузера запрос обрабатывался нормально. Поэтому я просмотрел заголовки запросов в браузере и добавил заголовок Accept в Postman, например: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

person Pedro Madrid    schedule 27.04.2016

Кроме того, вы можете исправить добавление «Принять», «/»

val headers = HttpHeaders()
headers.add("Accept", "*/*")
val httpEntity = HttpEntity("parameters", headers)
restTemplate.exchange(....)
restTemplate.exchange("http://localhost:" + serverPort + "/product/1",
            HttpMethod.GET,
            httpEntity,
            String.javaClass)

Извини это котлин

person wakedeer    schedule 23.08.2019

У меня была такая же проблема, и, наконец, это проблема библиотеки. Если вы не используете maven, убедитесь, что у вас есть основная библиотека json и все ее зависимости. Если ваш метод имеет входные параметры, загруженные в формате json, и у вас нет этих библиотек, вы получите ошибку 415. Я думаю, что две ошибки имеют одно и то же происхождение: неполные библиотеки.

person leon cio    schedule 16.05.2018