您的位置:首页 > 编程语言 > Java开发

######springmvc中方法返回值为String时@responseBody不能返回json对象。

2017-12-09 20:21 661 查看
==============【应用:这一特性,springmvc文件上传时,富文本 kindEditor插件,页面返回 改为 String,解决了《文件上传浏览器兼容性问题》】

===因为所有浏览器都支持 文本格式。即String类型。

===方法返回值类型是对象,注解会转换为json对象返回浏览器,而有的浏览器不支持 json数据。===例如360.

导致文件上传失败。

代码:

@Controller
public class UploadController {

//注入图片服务器地址 ====常量放到 配置文件。====否则修改需要 停止服务器,重新编译
@Value("${IMAGE_URL}")
private String IMAGE_URL;

/**
* 需求:使用fastDFs分布式文件系统上传图片
* 请求:/pic/upload
* 参数:uploadFile
* 返回值:
* 成功时:
* {
"error" : 0,
"url" : "http://www.example.com/path/to/a.jpg",
"message":null
}
* 失败时:
* {
"error" : 1,
"url" : null,
"message":"上传失败"
}
*
*/
@RequestMapping("/pic/upload")//===请求
@ResponseBody
// public KindEditorModel uploadPic(MultipartFile uploadFile){//===参数 名
public String uploadPic(MultipartFile uploadFile){
//==######=返回String(所有浏览器都支持 文本格式,有的不支持json),解决浏览器兼容性
//===返回 String类型json字符串,===不是json对象

try {

//获取上传===文件名称
String originalFilename = uploadFile.getOriginalFilename();
//获取===文件扩展名
String extName = originalFilename.substring(originalFilename.lastIndexOf(".")+1);

//===创建fastDFS工具类对象,===实现文件上传
FastDFSClient fClient = new FastDFSClient("classpath:conf/client.conf");

//上传
//返回图片虚拟地址:group1/M00/00/00/wKhCQ1opB9uAb0VHAA1rIuRd3Es992.jpg
String url = fClient.uploadFile(uploadFile.getBytes(), extName);

//组合====图片服务器绝对地址
url = IMAGE_URL+url;

//上传图片成功
//创建KindEditorModel对象,======封装图片上传信息
KindEditorModel model = new KindEditorModel();
model.setError(0);
model.setUrl(url);

//转换json字符串
String picJson = JsonUtils.objectToJson(model);

return picJson;

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//上传图片失败
//创建KindEditorModel对象,封装图片上传信息
KindEditorModel model = new KindEditorModel();
//
model.setError(1);
model.setMesssage("上传失败");
//转换json字符串
String picJson = JsonUtils.objectToJson(model);

return picJson;
}

}

}


===案例:



==================参考博客:失败案例2:【springmvc String类型返回值, @responseBody不能返回json对象】


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


springmvc中方法返回值为String时@response不能返回jso

这是我后台代码:



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

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



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

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



这下问题来了,为什么不是这种形式的数据  channelId:2  呢?@response 它不是会把数据转换成json吗?

如果我把方法的返回值类型改成Map<String,Object>,它能成功转成json数据,可是String为什么不能呢?

哪位大神告诉我原理啊?谢谢。。。

更多0分享到:

发表于: 2016-01-27 14:20:56 楼主

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:6



CSDN官网
DB2 v8.2,v9.1,v9.5,v9.7下载地址及详细安装图解

db2数据库免费版限制下载地址

IBM DB2 通用数据库 在64位平台上使用DB2 通用数据库.rar

DB2 数据库 快速入门(IBM官方资料简体中文版)

DB2全套学习资料

DB2数据库管理软件 - db2mon v1.0

DB2数据库odbc驱动

任意数据库转换系统 DB2DB 1.8

封装了DAO对象用于直接操纵access数据库 

WebDriver的Firefox-0.19.0驱动器




u013066244
思念悲伤 


自己顶一顶,希望大神来回答下,


回复于: 2016-01-27 14:43:21#1 得分:0

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理




tzdwsy
嗡汤圆 


RequestMappingR中加上produces=“application/json”试试
回复于: 2016-01-27 18:19:22 

 来自移动客户端#2 得分:50

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理




u013066244
思念悲伤 


自己解决了:针对我上面的例子,解决办法是增加如下代码

Java code

?
如图:



回复于: 2016-01-27 19:50:21#3 得分:0

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理




xiaofanku 


街头小贩 



 

 

 更多勋章
去看看json的格式吧。
回复于: 2016-01-27 21:50:04#4 得分:15

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理




u013066244
思念悲伤 


引用 2 楼 tzdwsy 的回复:

RequestMappingR中加上produces=“application/json”试试

这样写只是返回前台后不报错,但是数据格式依然不是json的,它只是在返回的数据上打了个引号;“channelId=2”

真正的解决方法应该是这样的

Java code

?
这里需要注意是,当使用简单类型即:String这样的类型来接收数据时,不需要使用@RequestBody这个注解。

我之前用了,后台断点调试结果分析 channelId = “channelId=2”.结果被解析成这样。

我前台发送数据的是:

JavaScript code

?
原本我发送数据格式是data:{"channelId":channelId},并且使用@RequestBody,

但是这样后台得到的数据变成channelId = “channelId=2”。

所以我用手动拼接字符串来发送数据。

当然真正实际应用一般不是用String来接收数据,一般都是pojo类对象来接收!(给自己做总结)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: