Spring REST消耗导致HTTP状态406 - 不可接受

时间:2012-07-11 09:41:09

标签: spring rest http-status-code-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);
}

以下是映射请求的Controller代码:

@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)会发生,尽管映射器应该处理映射到正确的类型?

6 个答案:

答案 0 :(得分:1)

您正在发送Accept=标头而不是Accept:标头。

答案 1 :(得分:1)

当我的请求中出现错误的Accept:标题时,我得到了这个答案。我试图请求image / jpeg,但我的请求包含“Accept:application / json”。

解决方案是使用正确的实体类来查询(我正在查询Object以查看会发生什么),在我的案例中是Resource.class。

答案 2 :(得分:0)

将此添加到spring mvc dispatcher:

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

答案 3 :(得分:0)

在我的情况下,我修复了这个问题,不是在服务器端,而是在客户端。我正在使用Postman并且收到406错误。但是使用浏览器处理请求就好了。所以我查看了浏览器中的请求标头,并在Postman中添加了Accept标头,如下所示:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

答案 4 :(得分:0)

此外,您可以修复添加“接受”,“ /

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)

对不起,是科特林

答案 5 :(得分:-1)

我遇到了同样的问题,最后这是一个库问题。如果您不使用maven,则必须确保包含json核心库及其所有依赖项。 如果您的方法具有以json格式加载的输入参数,并且您没有此库,则会出现415错误。 我认为这两个错误的起源相同:不完整的库。