springmvc中方法返回值为String时@response不能返回json数据

山鬼谣me 2016-01-27 02:20:56
这是我后台代码:


当我前台发送一个channelId=2给后台时,通过断点调试如上图可以知道已经接受到了。

可是前台接受到数据后报错:


上网一查知道这个错误是因为返回的数据不是json的原因造成的。

通过浏览器调试功能查看返回的是:channelId=2如图:


这下问题来了,为什么不是这种形式的数据 channelId:2 呢?@response 它不是会把数据转换成json吗?
如果我把方法的返回值类型改成Map<String,Object>,它能成功转成json数据,可是String为什么不能呢?
哪位大神告诉我原理啊?谢谢。。。
...全文
5786 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
山鬼谣me 2016-01-28
  • 打赏
  • 举报
回复
引错楼层了,我上面是要引用我自己的楼层!
山鬼谣me 2016-01-28
  • 打赏
  • 举报
回复
引用 2 楼 tzdwsy 的回复:
RequestMappingR中加上produces=“application/json”试试
这样写只是返回前台后不报错,但是数据格式依然不是json的,它只是在返回的数据上打了个引号;“channelId=2” 真正的解决方法应该是这样的

	@RequestMapping(value="/ceshijson",produces="application/json;charset=UTF-8")
	@ResponseBody
	public String ceshijson(String channelId) throws IOException{
		Map<String,Object> map = new HashMap<String,Object>();
		 map.put("channelId", channelId);
		 ObjectMapper mapper = new ObjectMapper();
		 channelId = mapper.writeValueAsString(map);
		 
		return channelId;
	}
这里需要注意是,当使用简单类型即:String这样的类型来接收数据时,不需要使用@RequestBody这个注解。 我之前用了,后台断点调试结果分析 channelId = “channelId=2”.结果被解析成这样。 我前台发送数据的是:
$.ajax({
		          url:"ceshijson",
		          type:"post",
		          dataType:'json',
		          //contentType:'application/json;charset=utf-8',
		          data:"channelId="+channelId,
		          success:function(data){
		          		alert(data);
		          },
		          error:function(XMLHttpRequest, textStatus, errorThrown){  
               		alert("Error")  
               		alert(XMLHttpRequest.status);  
                    alert(XMLHttpRequest.readyState);  
                    alert(textStatus);  
                   }
        	});
原本我发送数据格式是data:{"channelId":channelId},并且使用@RequestBody, 但是这样后台得到的数据变成channelId = “channelId=2”。 所以我用手动拼接字符串来发送数据。 当然真正实际应用一般不是用String来接收数据,一般都是pojo类对象来接收!(给自己做总结)
街头小贩 2016-01-27
  • 打赏
  • 举报
回复
去看看json的格式吧。
山鬼谣me 2016-01-27
  • 打赏
  • 举报
回复
自己解决了:针对我上面的例子,解决办法是增加如下代码
ObjectMapper mapper = new ObjectMapper();
channelId = mapper.writeValueAsString(channelId);


如图:
嗡汤圆 2016-01-27
  • 打赏
  • 举报
回复
RequestMappingR中加上produces=“application/json”试试
山鬼谣me 2016-01-27
  • 打赏
  • 举报
回复
自己顶一顶,希望大神来回答下,

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧