Spring 4.0 REST调用导致406错误代码

时间:2014-10-29 17:30:27

标签: json spring rest

我的REST调用一个简单的控制器我已经设置了总是返回406(不可接受)的响应代码。 我的请求标题有Accept:'application / json'和 我的classpath中也有jackson库

Spring版本使用4.0.6(我也试过4.0.5)。 App Server Tomcat 8

我的班级

@RestController
@RequestMapping("/menu")
public class TestController extends AbstractController {


    @RequestMapping(method = RequestMethod.GET, value = "/config")
    public Map getConfig (final HttpServletRequest request)
    {
        return new HashMap();
    }

}

我也尝试将我的方法注释更改为:

@RequestMapping(method = RequestMethod.GET, value = "/config", produces={"application/json"})

My Spring网络上下文文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="defaultContentType" value="application/xml" />
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json"/>
            </map>
        </property>
    </bean>
</beans>

我也试过一个简单的

<mvc:annotation-driven/>

标签,没有contentNegotiationManager bean。应用程序以两种方式启动,并且调用服务器上的方法,但每次都得到406响应。

客户请求标题:

Host: 127.0.0.1:8002
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: application/json,application/xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Referer: http://127.0.0.1:8002/myapp/login.rest
Cookie: JSESSIONID=431505385C0E8A5AAC878BA2B8AE1F92; 
Connection: keep-alive

杰克逊图书馆在我的课程中使用:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.4.3</version>
        </dependency>

我也尝试过使用jackson 2.3.3库。

仅使用注释运行一个简单的Spring启动示例可以正常工作。我不确定我在这里缺少什么。

Stackoverflow上的大多数其他Spring 406问题似乎与缺少的jackson库或不正确的请求头有关,我都有。

我认为我的春季网络环境文件遗漏了一些东西。但我的印象是Spring应该自动处理我对JSON的响应。 关于我在这里缺少什么的想法?

在我的所有尝试中,都会调用服务器代码,但每次响应都是406。

2 个答案:

答案 0 :(得分:0)

如果您尝试直接从浏览器调用此URL,则会抛出406错误。但是,如果您是通过AJAX请求执行此操作,但仍然会抛出406错误,您可以尝试以下解决方法[在我的情况下工作]:

<强> 1。编辑内容协商管理器以包含以下属性

  <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

  <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
      <property name="favorPathExtension" value="false" />
  </bean>

  <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>

<强> 2。将您的@RequestMapping更改为以下

@RequestMapping(value = "yourURL", method = RequestMethod.GET, produces = "application/json", headers = "Accept=*/*")

这适用于我的情况。希望它也适合你.. !!

答案 1 :(得分:0)

行。这很尴尬。问题结果是我有另一个application-context.xml文件(拼写错误的一个字母)。错误的应用程序上下文文件是正在使用的文件,并且已经配置了spring 3.2.4。(我们升级之前的spring版本)

我一直在更新和更改web.xml中没有引用的application-context.xml文件,因此Spring没有使用它。

使用旧配置删除重复文件,并更新web.xml以引用正确的文件,现在它就像一个魅力!