由于做项目使用Spring-MVC架构,而Json格式的数据又是返回前端时经常用到的,越是常见的东西往往莫名其妙的出错,后端是这样写的:
@RequestMapping(value ="/application/applicationPublish", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
@ResponseBody
public Json applicationPublish(@RequestParam("AppImg") MultipartFile AppImg,@RequestParam("AppDoc") MultipartFile AppDoc, DeveloperApplication developerApplication,HttpServletRequest request, HttpServletResponse response) {
SessionInfo sessionInfo = (SessionInfo) Webutil.getSessionInfoAttribute(request);
//应用发布之前重设协议名称
developPackageService.saveNewProtocolName(sessionInfo, developerApplication.getId());
Json json = applicationService.savePublishApplication(sessionInfo, AppImg, AppDoc, developerApplication.getId(), developerApplication);
return Json;
}
没想到报错了,先是后台报Could not find acceptable representation,把produses去掉以后,前台又报Unexpected token < in JSON at position 0,最后查看http协议头终于解决问题:
普通的form提交后,请求头是这样的:
Accept:
application/json, text/javascript, */*; q=0.01
Content-Type:
application/x-www-form-urlencoded; charset=UTF-8
但是带文件上传的form中,请求头是这样的:
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,i
Content-Type:
multipart/form-data; boundary=----WebKitFormBounda
其中,Accept代表发送端(客户端)希望接受的数据类型。 Content-Type代表客户端希望接受的数据类型是xml类型。这说明,文件上传的form,客户端希望接收的是text/html类型,而不是Json对象,所以直接返回是有问题的。
解决上述问题:
@RequestMapping(value ="/application/applicationPublish", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
@ResponseBody
public void applicationPublish(@RequestParam("AppImg") MultipartFile AppImg,@RequestParam("AppDoc") MultipartFile AppDoc, DeveloperApplication developerApplication,HttpServletRequest request, HttpServletResponse response) {
SessionInfo sessionInfo = (SessionInfo) Webutil.getSessionInfoAttribute(request);
//应用发布之前重设协议名称
developPackageService.saveNewProtocolName(sessionInfo, developerApplication.getId());
Json json = applicationService.savePublishApplication(sessionInfo, AppImg, AppDoc, developerApplication.getId(), developerApplication);
BaseResult.writeJson(request, response, json);
}
其实就是把Json对象转化成Json字符串再传到前端即可解决。