springmvc中直接在Resposboday中处理数据的异常解决方法
2017-05-15 15:42
316 查看
前面提到过在把数据库的数据转成JSON回传到应用界面时产生的中文乱码和特殊字符的处理方法,这里在从安卓的客户端上传JSON数据到服务端时,也发现了一些异常情况。
首先,在传送JSON到数据库时,服务端是这么做的:
data)
{
//解析并添充数据
int num = idService.insertSelective(data);
HttpHeaders headers = new
HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
//return new ResponseEntity<PersonBase>(pb,headers,HttpStatus.OK)
String s = JSON.toJSONString(num);
return new ResponseEntity<String>(s,headers,HttpStatus.OK);
}
有两种情况,一种是Get,一种是POST,但是大家都知道Get方式在传送数据时会有一些长度的限制,比如有的说是1024个字节,有的说是2883个字节,反正总归是有的。查了资料说其实Get本身的协议是没有限制的,有限制的是实现这个协议的浏览器软件。不同的浏览器有不同的长度限制。
所以只好又实现一个POST版本,如上所述,它的协议里是没有限制大小的,但是实际实现起来,在服务端的TOMCAT和相关的软件还是多少有限制的。默认是2M的大小。
可是这个在简单的测试中发现是正确的,但是当把数据POJO的BASE64字符串添满后,首先是Get的长度不够了。
换成POST后,发现报一些异常“org.codehaus.jackson.JsonParseException: Illegal unquoted character((CTRL-CHAR, code 10)): has to be escaped using backslash to be included instring value”。还是怀疑是springmvc的原因,但是已经在上文中配置了,上传的配置不知道怎么配置啊。
另外在使用fiddler2在模拟发送数据的时候儿,发现使用的字符串发送中如果有空格也报一些错误。网上有解决办法:
public static <T> T jsonToEntity(String json, Class<T>clazz) throws IOException {
ObjectMapper mapper = new ObjectMapper();
// 允许反斜杆等字符
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);
return mapper.readValue(json, clazz);
}
但是在使用后发现,所有的字符串转换都是空,也就是说,异常没有报,但数据转换全是错的,咋办?
凉拌呗!试了好多次都解决不了问题,后来冷静下来想了下,查看一下发送的数据,里面有大量的“/”字符。估计是它导致的。又去查BASE64发现人家就必须得有这玩意儿。那好吧,还是从网上测试一下,在百度搜了几个测试JSON的在线网站,把传送的数据放到上面,都非常妥妥的解析了出来。
既然这样,肯定没啥特殊的,否则照样别人也是解析不出来的。在接的@RequestBody参数中不再使用POJO对象,不让SPRINGMVC自动转换而是自己接收JSON自己转换:
发现直接就转换好了。也是醉了一次又一次。
慢慢来吧。
首先,在传送JSON到数据库时,服务端是这么做的:
@RequestMapping("/setIrisData/{data}") public ResponseEntity<String> setIrisData(@PathVariable String data) { //解析并添充数据 String jsonstr = DoWithIrisData(data); HttpHeaders headers = new HttpHeaders() ; headers.setContentType(MediaType.TEXT_PLAIN); return new ResponseEntity<String>(jsonstr,headers,HttpStatus.OK); } @RequestMapping(value ="/setIrisDataPost",method= RequestMethod.POST) public ResponseEntity<String> setIrisDataPost(@RequestBody PersonBase
data)
{
//解析并添充数据
int num = idService.insertSelective(data);
HttpHeaders headers = new
HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
//return new ResponseEntity<PersonBase>(pb,headers,HttpStatus.OK)
String s = JSON.toJSONString(num);
return new ResponseEntity<String>(s,headers,HttpStatus.OK);
}
有两种情况,一种是Get,一种是POST,但是大家都知道Get方式在传送数据时会有一些长度的限制,比如有的说是1024个字节,有的说是2883个字节,反正总归是有的。查了资料说其实Get本身的协议是没有限制的,有限制的是实现这个协议的浏览器软件。不同的浏览器有不同的长度限制。
所以只好又实现一个POST版本,如上所述,它的协议里是没有限制大小的,但是实际实现起来,在服务端的TOMCAT和相关的软件还是多少有限制的。默认是2M的大小。
可是这个在简单的测试中发现是正确的,但是当把数据POJO的BASE64字符串添满后,首先是Get的长度不够了。
换成POST后,发现报一些异常“org.codehaus.jackson.JsonParseException: Illegal unquoted character((CTRL-CHAR, code 10)): has to be escaped using backslash to be included instring value”。还是怀疑是springmvc的原因,但是已经在上文中配置了,上传的配置不知道怎么配置啊。
另外在使用fiddler2在模拟发送数据的时候儿,发现使用的字符串发送中如果有空格也报一些错误。网上有解决办法:
public static <T> T jsonToEntity(String json, Class<T>clazz) throws IOException {
ObjectMapper mapper = new ObjectMapper();
// 允许反斜杆等字符
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);
return mapper.readValue(json, clazz);
}
但是在使用后发现,所有的字符串转换都是空,也就是说,异常没有报,但数据转换全是错的,咋办?
凉拌呗!试了好多次都解决不了问题,后来冷静下来想了下,查看一下发送的数据,里面有大量的“/”字符。估计是它导致的。又去查BASE64发现人家就必须得有这玩意儿。那好吧,还是从网上测试一下,在百度搜了几个测试JSON的在线网站,把传送的数据放到上面,都非常妥妥的解析了出来。
既然这样,肯定没啥特殊的,否则照样别人也是解析不出来的。在接的@RequestBody参数中不再使用POJO对象,不让SPRINGMVC自动转换而是自己接收JSON自己转换:
@RequestMapping(value ="/setIrisDataPost",method= RequestMethod.POST) public ResponseEntity<String> setIrisDataPost(@RequestBody String data) { //解析并添充数据 IrisData iData = JSON.parseObject(data,IrisData.class); int num = idService.insertSelective(iData); HttpHeaders headers = new HttpHeaders() ; headers.setContentType(MediaType.TEXT_PLAIN); //return new ResponseEntity<PersonBase>(pb,headers, HttpStatus.OK) String s = JSON.toJSONString(num); return new ResponseEntity<String>(s,headers,HttpStatus.OK); }
发现直接就转换好了。也是醉了一次又一次。
慢慢来吧。
相关文章推荐
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- WinForm程序中未处理异常的解决方法
- FFMpeg直接解码live555收到的网络数据包时错误解决方法
- linq to sql统一更新方法,直接返回更新的对象(解决更新后再刷新数据错误显示问题)
- Flexigrid在IE下不显示数据的处理的解决方法
- FFMpeg直接解码live555收到的网络数据包时错误解决方法
- Label mx条码软件导入Excel处理异常解决方法
- springmvc统一的异常处理方法
- WinForm程序中未处理异常的解决方法
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- Flexigrid在IE下不显示数据的处理的解决方法
- ASP.NET MVC Json()处理大数据异常解决方法