4

我在 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 执行此代码时,我收到以下错误:

网址:

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
4

6 回答 6

3

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

于 2014-09-19T12:53:58.463 回答
2

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

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

如果没有这个库,您只能返回 String 或类似于 String 标准类型

于 2013-08-11T17:50:10.513 回答
1

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

@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 是非常常见的选项,但序列化为视频流……不太常见,我们可以说吗?

您还需要适当的消息转换器

于 2013-08-11T17:45:54.357 回答
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

于 2014-08-22T14:50:49.610 回答
0

您是否可能忘记在ResponseText中实现 Serializable

于 2014-03-16T09:27:17.203 回答
0

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

<context:annotation-config/>

但是忘记包含 mvc 注释驱动:

<mvc:annotation-driven/> 

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

servlet 中的 <mvc:annotation-driven /> 和 <context:annotation-config /> 有什么区别?

于 2016-08-06T11:33:09.227 回答