问题现象
测试告诉我文件下载失败,我们的业务逻辑是每个文件都会有19位数的ID,后端通过JPA查询对象扔回给前端,数据结构中就包含了这个Long类型的ID,通过现象看出来浏览器请求的接口获取的ID和API工具测出来的完全不一样,API测试工具和数据库是一致的,并且也能根据ID下载文件,唯独浏览器的不一样。
问题原因
JS中支持的Numer类型最大只支持16位长度,但是我们的数据库ID是通过雪花算法计算得出的19位Long类型(Java对应数据库的bigint)数字,这就会导致js在转义的时候出现超位计算不精确的问题。
解决方案
模板返回类
@Data
@Entity
@Accessors(chain = true)
@Table(name = "表名")
public class ReportUploadInfo extends Audited {
@Id
@GeneratedValue(generator = "snowflake")
@GenericGenerator(name = "snowflake", strategy = SnowflakeGenerator.TYPE)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
// 就是这个Long fileId出现问题的,切记要在此处加上序列换转字符类型
@JsonSerialize(using = ToStringSerializer.class)
private Long fileId;
}