zoukankan      html  css  js  c++  java
  • java Long类型数据传到前端数据丢失问题

      long类型64位,JS的Number精度只有53位,所以后台数据传到前端的时候,精度丢失,后面几位被置为0了。

    尝试过的解决办法:

      1、在Long类型字段上使用注解标明序列化方式。此方式细粒度到当前字段,我尝试了几种方法之后选用了此方法。

      @JsonSerialize(using = ToStringSerializer.class)
      private Long id;

      2、自定义解析方法

      /**
      * 解决Jackson导致Long型数据精度丢失问题
      *
      * @return
      */
      @Bean("jackson2ObjectMapperBuilderCustomizer")
      public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        Jackson2ObjectMapperBuilderCustomizer customizer =
        jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
          .serializerByType(Long.class, ToStringSerializer.instance)
          .serializerByType(Long.TYPE, ToStringSerializer.instance);
        return customizer;
      }

      3、自定义ObjectMapper,没找到代码就不写了。

      4、自定义MappingJackson2HttpMessageConverter,此方法可以指定拦截哪些请求(其他方法应该也可以实现)才做处理。

      当然还有其他方法自行百度吧。

      其中,后面几种方法是把返回的实体中所有的long类型都转成了字符串类型,项目中应该根据实际需要,选取合适的方案。

    背景:

      最近工作中,被运维要求整改mysql数据库表,大体分两类:无主键 和 使用了自增ID。

      无主键的表,就加个主键呗,还能提升查询效率,一句sql搞定。

      使用自增ID的表,就把自增去掉呗,然后根据业务需要,大概找了一些分布式ID生成方案做参考,选用了美团的leaf中snowflake的实现(其他方案可以自行百度),源码见链接 https://github.com/Meituan-Dianping/Leaf 。

      简单聊一下,long类型一共64位,去掉一个符号位,10位workID,12位自增序列,还有41位取时间戳差值,简单算一下可以使用69年(估计我不在了,程序还在)。这样一算,10位workID最多支持1024个节点(一台机器上的一个服务对应一个节点)同时注册(目前我们所有节点加一起应该不超过50个),workID使用ZK的顺序节点实现,12位自增序列每ms就有4000个左右(每秒就可以生成400W个ID),这样完全满足我们业务使用了。

      后端改好了美滋滋,打包,上环境,完了,各种报错。

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/laydown/p/15024986.html
Copyright © 2011-2022 走看看