2010-07-27 70 views
12

我试着让Spring中的控制器返回一个JSON响应,但无法使用Jackson类作为recommended with 3.0。我在课程路径中有杰克逊jar文件(jackson-core-asl-1.5.5.jar & jackson-mapper-asl-1.5.5.jar)。Spring的Json没有被正确的响应解决

至于appconfig.xml条目,我不知道我需要这些。我把它们放在那里作为绝望的最后一幕,然后回到ol时尚非json ajax。

在调试,我看控制器获得请求,返回FOO,然后在萤火,得到406

错误消息如下:设置调试 从记录器: 组织.springframework.web.HttpMediaTypeNotAcceptableException:无法找到可接受表示

从响应: (406)由该请求所标识的资源仅能够利用根据“接受”报头中的请求不被接受的特性产生响应的() 。

我appconfig.xml是在这里:

<!-- Configures support for @Controllers --> 
    <mvc:annotation-driven /> 

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> 
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
    <map> 
     <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/views/"/> 
     <property name="suffix" value=".jsp"/> 
     </bean> 
    </list> 
    </property> 
    <property name="defaultViews"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
    </list> 
    </property> 
</bean> 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages"></property> 
    </bean> 

我控制器

@RequestMapping(value="foo/bar", method=RequestMethod.GET) 
public @ResponseBody foo getFoo(@RequestParam String fooId) { 
    return new foo(fooId); 
} 

在JSP,其中AJAX调用时:

function addRow() { 
$.getJSON("foo/bar",{ fooId: 1} , function(data) { 
alert("it worked.");   
}); 

}

让我知道是否有一个需要更多信息。

+0

更多报道[春季JSON请求获取406(不可接受)](http://stackoverflow.com/questions/7462202/spring-json-request-getting-406-not-acceptable) – kdgregory 2012-08-16 01:45:49

回答

14

摆脱所有杰克逊豆,以及谈判解决方案中的json映射。 mvc:annotation-driven应该配置Jackson序列化工作所需的一切。

+0

谢谢! 我删除了与杰克逊相关的所有内容,并且警报出现了。 – ClutchDude 2010-07-27 12:40:46

+0

我也试过,但它对我不起作用。有任何想法吗?我在我的classpath上有Jackson,并且我使用了一个普通的旧对象,但它似乎仍然没有切断它。 – stevebot 2010-11-13 00:52:19

+0

@stevebot你可以问一个新的问题,提供相关的细节。 – Bozho 2010-11-13 08:38:37

1

发送Accept:application/xml头不起作用。但发送接受:应用程序/ JSON实际上工作,和杰克逊映射器踢。我摆脱了我的406,并得到我的序列化的JSON格式的Java对象,没有更多的配置比@ResponseBody并返回新的MyObject() :) 谢谢skaffman对于这个信息,并感谢Bozho的工作标题值:D

+1

在@RequestBody注解中使用'produce =“application/json”'怎么样? – Ithar 2015-01-16 17:18:13

1

这个问题在网上随处可见,我被它咬了几次。 Spring 3.0.6(和5个可能)在呈现json方面存在一些问题。一旦我更改为3.1.0.RELEASE版本,eveyrything按原样工作。没有任何配置更改。需要注意的是,return方法必须具有@ResponseBody(如前例所示),并且必须位于servlet-context.xml或您的spring上下文配置文件中。

0

可能我的答案有点晚,但它可能会帮助其他人访问此问题。

我被加入

hibernate-validator-4.0.2 

解决我的问题,并给了我另一个异常(类未发现异常:org.slf4j.LoggerFactory),我决心加入

slf4j-api-1.5.6.jar 

我希望它会帮助别人。

2

此外,请确保您添加两个杰克逊相关的jar文件。

  • jackson-core-asl-1.9.8.jar
  • jackson-mapper-asl-1.9.8.jar

版本可以是不同的。

+0

是的,这是我错过的东西。对于使用'@ RequestBody'和'@ ResponseBody',默认的json格式和jackson jars将被考虑用于pojo的转换。 – 2014-06-20 06:46:12

2

我知道这是一个旧线程,但也许有人会遇到和我一样的问题。将应用程序从Spring 4.0.3.RELEASE迁移到Spring 4.1.0.RELEASE时,我得到了这个异常。在我的情况下更新杰克逊从1.9.x到2.4.x做了伎俩。

3
  1. 确保您返回的POJO已获得(),每个字段一个。
  2. 确保appserver(Tomcat)拥有这些库,即使您确信您的构建系统(Eclipse/Maven)也有。

我现在有两次这个错误。 刚才我把getters添加到了我的pojo中。 406错误消失了,我得到了预期的JSON。 我认为,因为我的领域是封装保护(默认访问),它会抓住他们,但我想不是。 为了记录,万一它很重要,我还使POJO实现了Serializable,toString(),serialVersionUID,no-arg构造函数和显式构造函数。

以前我清理/清除/刷新我的Tomcat缓存,并做了其他任何事情来强制它重新加载。我相信当我添加Jackson依赖时,它修复了我的编译时错误,但是因为tomcat错过了它们,所以在运行时Spring MVC没有发现Jackson库,并且产生了关于不可接受的响应类型的406错误。

1

从spring 3.x迁移到spring 4.x时,我得到了同样的异常。

我与杰克逊更新解决了依赖从

<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-core</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.5.1</version> 
    </dependency> 

没有别的。

+0

也为我工作。 – renanlf 2015-03-12 13:47:58