Spring 3.x JSON状态406“根据请求“ accept”标头(),特征不可接受”
问题内容:
在尝试获得JSON
使用的响应时Spring 3.x
,我得到了406 error
“此请求标识的资源只能根据request
“
accept”标头()生成特性不可接受的响应”。
这是我的环境
* Spring 3.2.0.RELEASE
* included jackson-mapper-asl-1.7.9.jar, jackson-core-asl-1.7.9.jar
* Tomcat 6.x
* mvc:annotation-driven in Spring configuration XML file
我的控制器:
@RequestMapping("/contest")
public class ContestController {
@RequestMapping(value="{name}", headers="Accept=*/*", method = RequestMethod.GET)
public @ResponseBody Contest getContestInJSON(@PathVariable String name) {
Contest contest = new Contest();
contest.setName(name);
contest.setStaffName(new String("contestitem1"));
return contest;
}
}
我的Spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.contestframework.controllers" />
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml"/>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
<mvc:annotation-driven />
</beans>
在此之后,我只需使用以下命令访问控制器:
http://domain/SpringWebProject/json/contest/abcd
并且我得到的响应是状态406:“此请求标识的资源只能根据请求“接受”标头()生成特性不可接受的响应。”
我还尝试通过使用Javascript
AJAX
来确保使用我的请求标头访问此方法的替代机制,application/JSON
但这导致了相同的Status 406结果
$.getJSON('contest/abcd', function(data) {
console.log(data) }
这是从浏览器捕获的我的请求头:
Request URL:http://localhost:8080/SpringWebProject/json/contest/abcd
Request Method:GET
Status Code:406 Not Acceptable
Accept:application/json, text/javascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=59689C95B0B9C21494EB0AB9D9F7BCCD
Host:localhost:8080
Referer:http://localhost:8080/SpringWebProject/json/welcome
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
X-Requested-With:XMLHttpRequest
Response Headersview source
Content-Length:1070
Content-Type:text/html;charset=utf-8
Date:Fri, 12 Oct 2012 18:23:40 GMT
Server:Apache-Coyote/1.1
感谢这方面的帮助。
问题答案:
您的配置没有任何问题,不过,我还是建议您进行一些小的更改:
a)您的命名空间似乎不正确-它们引用的是3.0模式,只需将其更改为3.1或不明确引用版本即可,例如
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
要么
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
b)你不需要ContentNegotiatingViewResolver,可以去除一切,但component- scan
并<mvc:annotation-driven/>
从配置
c)该请求将无法直接在浏览器中工作,因为它明确要求“ Application / json”的Accept报头-
$.getJson
尽管该调用发送正确的报头,但该调用应该可以工作
d)headers=Acc..
从@RequestMapping中删除,并产生两个过滤条件,以匹配正确的映射方法调用。
有了这些,就没有理由不提供json了,您能尝试一下这些吗,看看效果如何。