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

springmvc中直接在Resposboday中处理数据的异常解决方法

2017-05-15 15:42 316 查看
前面提到过在把数据库的数据转成JSON回传到应用界面时产生的中文乱码和特殊字符的处理方法,这里在从安卓的客户端上传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);
}

发现直接就转换好了。也是醉了一次又一次。

慢慢来吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web json
相关文章推荐