Spring 3.0使用jackson消息转换器进行JSON响应
我将我的messageconverter配置为jackson的
class Foo{int x; int y}
并在控制器中
@ResponseBody public Foo method(){ return new Foo(3,4) }
从那个我期望从服务器返回一个JSON字符串{x:’3’,y:’4′},没有任何其他配置。 但得到我的ajax请求的404错误响应
如果使用@ResponseBody注释该方法,则将返回类型写入响应HTTP正文。 返回值将使用HttpMessageConverters转换为声明的方法参数类型。
我错了吗 ? 或者我应该使用序列化程序将我的响应对象转换为Json字符串,然后将该字符串作为响应返回。(我可以正确地进行字符串响应)或者我应该进行其他配置吗? 比如为Foo类添加注释
这是我的conf.xml
您需要以下内容:
- 设置注释驱动的编程模型:在
spring.xml
中spring.xml
- 在类路径中放置jaskson jar(Maven artifactId是
org.codehaus.jackson:jackson-mapper-asl
)。 -
使用如下:
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST }) public @ResponseBody Foo method(@Valid Request request, BindingResult result){ return new Foo(3,4) }
这对我有用。
请注意,那
-
@ResponseBody
应用于返回类型,而不是方法定义。 - 你需要
@RequestMapping
注释,以便Spring检测它。
这对我有用:
@RequestMapping(value = "{p_LocationId}.json", method = RequestMethod.GET) protected void getLocationAsJson(@PathVariable("p_LocationId") Integer p_LocationId, @RequestParam("cid") Integer p_CustomerId, HttpServletResponse response) { MappingJacksonHttpMessageConverter jsonConverter = new MappingJacksonHttpMessageConverter(); Location requestedLocation = new Location(p_LocationId); MediaType jsonMimeType = MediaType.APPLICATION_JSON; if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) { try { jsonConverter.write(requestedLocation, jsonMimeType, new ServletServerHttpResponse(response)); } catch (IOException m_Ioe) { // TODO: announce this exception somehow } catch (HttpMessageNotWritableException p_Nwe) { // TODO: announce this exception somehow } } }
请注意,该方法不返回任何内容: MappingJacksonHttpMessageConverter#write()
完成了魔术。
MessageConverter接口http://static.springsource.org/spring/docs/3.0.x/javadoc-api/定义了一个getSupportedMediaTypes()方法,在MappingJacksonMessageCoverter的情况下返回application / json
public MappingJacksonHttpMessageConverter() { super(new MediaType("application", "json", DEFAULT_CHARSET)); }
我假设缺少一个Accept:application / json请求标头。
HTTP 404错误只表示无法找到资源。 这可能有两个原因:
- 请求URL错误(客户端错误或给定链接/按钮中的错误URL)。
- 资源不在您期望的位置(服务器端错误)。
要修复1,请确保您正在使用或提供正确的请求URL(区分大小写!)。 要修复2,请检查服务器启动日志以查找任何启动错误并相应地进行修复。
这一切都超出了迄今为止发布的代码和信息。
我发现我也需要jackson-core-asl.jar,而不仅仅是jackson-mapper-asl.jar
这只是一个猜测,但默认情况下,jackson只会自动检测公共字段(和公共getter;但不管可见性如何都是自动检测器)。 如果需要,可以将此配置(使用版本1.5 )自动检测专用字段(有关详细信息,请参见此处 )。
我猜404与你的HttpMessageConverter无关。 我有同样的404问题,原因是我忘了只有匹配
请求被发送到DispatcherServlet(我将请求映射从* .do更改为* .json)。 也许这也是你的情况。
除了这里的答案..
如果你在客户端使用jquery,这对我有用:
Java的:
@RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestBody Foo json) {
Jquery(你需要包含Douglas Crockford的json2.js才能拥有JSON.stringify函数):
$.ajax({ type: "post", url: "sync", //your valid url contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me) data: JSON.stringify(jsonobject), //json object or array of json objects success: function(result) { //do nothing }, error: function(){ alert('failure'); } });