1遇到的问题
在开发过程中存在这样一种问题,我们使用的id主键主要有long类型和varchar类型
当主键id为long类型并且长度超过16位,当返回给前端时,前端会出现js解析的参数如果是Long类型的并且长度过大就会出现精度丢失。这就会造成后台返回的值与前端拿到的不一致问题。
2解决思路
根据加固项目采用Spring+springMVC+mango的架构设计前后端参数传递都有统一出入口,
根据FastJsonHttpMessageConverter实现了HttpMessageConverter对于后台返回的Java对象解析为outStream后返回给前端,在配置中实现拦截。
在 SpringMVC进入readString方法前会根据@requestBody选择HttpMessageConverter,http请求是基于文 本的浏览器和服务器通过交换原始文件进行通信这就意味着需要将我们的Java对象序列化和反序列化,及将Java对象解析到String变量中,当执行 readString方法时绑定string参数输出响应报文。
(响应时)springmvc-----java对象------HttpMessageConverter----outStream----响应报文
3实例说明
加固项目applicationContext-http.xml部分配置
application/json;charset=UTF-8
text/plain;charset=UTF-8
在Java对象转为json对象时会被FastJsonHttpMessageConverter这个处理类拦截,拦截时会触发自己配置的toStringSerializer处理类,该类中可以自定义所需要处理返回给前端的数据。
public class ToStringSerializer implements ValueFilter {
@Override
public Object process(Object object, String name, Object value) {
if(value != null && value instanceof Long) {
if(((Long) value).longValue()>=10000000000000000L) {
value = value+"";
}
}
return value;
}
}
自定义类ToStringSerializer 实现了ValueFilter 继承了SerializeFilter接口重写了process方法
该方法有三个参数:json对象,对象key,对象value当key对应的值为long类型且长度超过十六位此时统一在处理类中将该值转为字符串类型然后返回给前端。