错误HTTP状态406:@ResponseBody不返回数据

时间:2013-08-11 16:03:38

标签: web-services http rest spring-mvc

我在REST,Spring MVC中有以下代码。此代码应返回名为ResponseText的JSON类型数据结构:

@RequestMapping(value="/movieTheater", headers = {"ACCEPT=*/*"}, method=RequestMethod.GET)
public @ResponseBody ResponseText getCustomerInput(@RequestParam("name") String name, @RequestParam("price") Double price) {
    Transaction transaction = new Transaction();
    ResponseText result = new ResponseText();

    transaction.setMovieName(name);
    transaction.setTicketPrice(price);
    transaction.setDatetime(new Date());

    if(transactionService.addTransaction(transaction))
        result.setMessage(ResponseStatus.SUCCESS.getStatus());
    else
        result.setMessage(ResponseStatus.FAILED.getStatus());
    return result;
} 

但是当我通过浏览器中的以下URL执行此代码时,我收到以下错误:

URL:

http://localhost:8080/SpringMVCMerchant/movieTheater.htm?name=Smurfs&price=300.00

错误:

HTTP Status 406 -

type Status report

message

description The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

我无法确定我在这里做错了什么。我抬头看着网上解释这个错误,但仍然不知道我错过了什么。我已经给出了ACCEPT =“ / ”,它应该涵盖各种各样的回复,对吧? 请帮忙! 提前谢谢!

**当我添加标题

headers={"Accept: application/json, text/javascript"} 

而不是上面的错误,我得到以下错误:

HTTP Status 405 - Request method 'GET' not supported

6 个答案:

答案 0 :(得分:3)

我遇到了这个错误,当我删除了错误地添加到请求网址的.html后缀时,这个错误得到了解决!

答案 1 :(得分:2)

尝试将“jackson”依赖项添加到您的pom.xml中(或者如果您不使用maven,则添加适当的jar)。

<dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-mapper-asl</artifactId>
   <version>1.7.1</version>
</dependency>

如果没有此lib,您只能返回String或类似于String标准类型

答案 2 :(得分:1)

您应该通过@RequestMapping注释的produces属性定义可以生成的类型,而不是通过设置自定义标题。

@RequestMapping(value="/movieTheater", method=RequestMethod.GET, produces={"application/json","application/xml"})
public @ResponseBody ResponseText getCustomerInput(@RequestParam("name") String name, @RequestParam("price") Double price) {
    // ...
}

请注意,您可能应该只在produces属性中设置具体类型,说明实际可以生成哪些类型;除非你提供文件并做实际工作来确定MIME类型,否则声称生成任何东西实际上并不是那么有用。序列化为JSON和XML是非常常见的选项,但序列化为视频流是不太常见的,我们可以说吗?

您也需要适当的message converters

答案 3 :(得分:1)

我有同样的问题,但我想出来了:

(1)删除

headers={"Accept: application/json, text/javascript"} 

(2)将其添加到您的pom.xml中:

    <!-- add jackson to support restful API, otherwise the API will return 406 error -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

(3)改变产生:

produces={"application/json"}

(4)如果你有

,删除content-negotiation-manager

答案 4 :(得分:0)

您是否忘记在 ResponseText 实施Serializable

答案 5 :(得分:0)

对我来说问题是我包含了上下文注释驱动:

<context:annotation-config/>

但忘了包含mvc注释驱动:

<mvc:annotation-driven/> 

出于某种原因,在这种情况下,Spring返回406而不是404或相关。我不知道。

What's the difference between <mvc:annotation-driven /> and <context:annotation-config /> in servlet?