Java 奇怪的spring boot中的长值舍入问题

Java 奇怪的spring boot中的长值舍入问题,java,spring,spring-boot,jackson,Java,Spring,Spring Boot,Jackson,当我尝试使用Jackson对象映射器将对象序列化为JSON时,它工作得非常好 {"id":1291741231928705024,"uuid":null,"email":"kannanrbk.r@gmail.com"} 然而,当我尝试使用SpringREST控制器访问它时。长值数字四舍五入,最后3位 我阅读了stackoverflow中存在的问题,其中大多数建议将数据类型更改为string。但是我们在大多数地方

当我尝试使用Jackson对象映射器将对象序列化为JSON时,它工作得非常好

 {"id":1291741231928705024,"uuid":null,"email":"kannanrbk.r@gmail.com"}
然而,当我尝试使用SpringREST控制器访问它时。长值数字四舍五入,最后3位

我阅读了stackoverflow中存在的问题,其中大多数建议将数据类型更改为string。但是我们在大多数地方使用了长值引用,更改数据类型将需要一些重构

我做了初步分析:

  • 我们正在使用Jackson
    ObjectMapper

  • 从Spring,它间接调用
    MappingJackson2HttpMessageConverter
  • 这个问题可能发生在JSONParser的某个地方,它将任何数字视为两位数(15位数),然后四舍五入
  • 有没有办法解决这个问题

    有没有办法解决这个问题

    Jackson/Java/Spring引导没有问题,但是JavaScript/Browser有问题

    为了重现这个问题,我序列化了同一个对象,并使用
    curl

    $curl本地主机:8080
    {“id”:1291741231928705024,“uuid”:null,“email”:“kannanrbk。r@gmail.com"}
    
    在这里,数字被正确序列化

    Firefox中查看的相同json会截断:

    但是,“原始数据”选项卡正确显示数字:

    在JavaScript中,1291741231928705024不是安全整数(请参阅):

    Number.isSafeInteger(1291741231928705024);
    假的
    
    该数字大于
    2^53-1
    ,因此会四舍五入。JavaScript中可能出现更令人困惑的情况:

    >1291741231928705024==1291741231928705022
    真的
    

    可能的解决办法 首先,针对此类问题检查您的客户。如果它可以安全地反序列化这些数字,那么您就安全了

    或者你可以
    long
    s序列化为
    String
    s
    (正如你在问题中提到的),这就是Twitter在文章中提出的:

    为了允许Javascript和JSON解析器读取ID,Twitter对象在使用JSON响应时包含任何ID的字符串版本。因此,Twitter API中的状态、用户、直接消息、保存的搜索和其他ID在JSON响应中以整数和字符串的形式返回


    请尝试将bigInt用作主键

    JSON没有整型数据类型。所有的数字都是实数。因此,大多数解析器用双精度表示JSON数字。解决方法:要么使用字符串,要么确保数字不会太大。
    MappingJackson2HttpMessageConverter
    使用
    Jackson2ObjectMapperBuilder
    bean。您可以在某个地方插入Jackson2ObjectMapperBuilder,并使用它。使用plain
    new ObjectMapper().readValue(…)
    它可以工作,并且您的问题不可再现。@Vusal我尝试注入ObjectMapperBuilder,但问题仍然存在。我遗漏了什么吗?