我的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。
答案 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以引用正确的文件,现在它就像一个魅力!