【发布时间】:2011-11-20 08:54:08
【问题描述】:
我正在尝试使用 Spring 3.0.6 返回一个 JSON 响应,但我得到一个 406 响应“不可接受”,其描述如下: “此请求标识的资源只能生成具有特征的响应 根据请求“接受”标头()不可接受。”
我知道a very similar question 之前有人问过,但我无法让它适用于我的项目,尽管有很多 测试,我不明白我做错了什么。
在我的 Maven pom.xml 中,我有以下内容:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.8.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.8.5</version>
<scope>compile</scope>
</dependency>
在 web.xml 中我引用了 webmvc-config.xml,并且日志确认已加载。
<servlet>
<servlet-name>mainServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
在 webmvc-config.xml 我有以下内容:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:annotation-driven />
我的控制器是:
@Controller
public class ClassifiedController {
@RequestMapping(value = "/classified/{idClassified}", headers = "Accept=*/*",
method = RequestMethod.GET)
@ResponseBody
public final Classified getClassified(@PathVariable final int idClassified) {
...
我尝试使用或不使用 headers 参数,结果相同。如果我调用 URL 直接使用 Firefox 请求标头包含以下内容(使用 firebug 检查):
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
如果我使用以下 JQuery:
$.ajax({
url: '/classified/38001',
type: 'GET',
dataType: 'json'
});
发送以下标头:
Accept: application/json, text/javascript, */*; q=0.01
在这两种情况下,结果都是 406 错误。我不知道我还应该检查什么 它工作。
更新:我决定通过 Spring 进行调试,我发现 Jackson 被正确调用,并且在 org.codehaus.jackson.map.ser.StdSerializerProvider 方法 _findExplicitUntypedSerializer 包含以下代码:
try {
return _createAndCacheUntypedSerializer(runtimeType, property);
} catch (Exception e) {
return null;
}
这很不幸,因为隐藏了问题的根源。通过调试器,我发现该异常包含一个非常具有描述性的错误消息:
Conflicting getter definitions for property "reminded":
ClassifiedImpl#isReminded(0 params) vs
ClassifiedImpl#getReminded(0 params)
现在我看到错误消息是一个愚蠢的错误并且很容易修复,但没有它就不是那么明显了。事实上,解决问题后,序列化就可以工作了。
【问题讨论】:
-
你检查了输出的编码/我认为它们在 json heder 内容中有一些限制
-
Accept是否适用于@RequestMapping注释? static.springsource.org/spring/docs/current/… - 可能建议“content-type”。 -
您是否在上下文中创建了另一个 AnnotationHandlerMapping bean?
-
@nidhin,您的意思是在请求标头中吗?我有这个: Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
-
@Paul Grime,我认为两者都可以接受,无论如何我尝试使用 headers = "content-type=*/*" 现在我有一个 404。
标签: java json spring spring-mvc jackson