今天在写项目时发生前端数据丢失
在这种情况下,由于 JavaScript 的 Number
类型是 64 位浮点数,它无法精确表示超过 53 位的整数。因此,当将 Java Long
类型的值传递给 JavaScript 时,可能会发生精度丢失。
故在网上找了一圈 发现他们写的 自己都不知道用了没
故我自己写了个
/**
* 统一定义Long序列化转Sring设置
* @return
*/
@Bean
public MappingJackson2CborHttpMessageConverter mappingJackson2CborHttpMessageConverter(){
//构建http信息转换对象
MappingJackson2CborHttpMessageConverter converter = new MappingJackson2CborHttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
//反序列化忽略
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
SimpleModule simpleModule = new SimpleModule();
//Long|long
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
//注册转化器
objectMapper.registerModule(simpleModule);
//设置序列化实现
converter.setObjectMapper(objectMapper);
return converter;
}
还在网上看了几个 也用了感觉可行的
// @EnableWebMvc // 坑1
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters{
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
// 坑2
// converters.add(jackson2HttpMessageConverter);
converters.add(0, jackson2HttpMessageConverter);
}
}
@EnableWebMvc
@Configuration
public class WebDataConvertConfig implements WebMvcConfigurer {
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
/** * 序列换成json时,将所有的long变成string * 因为js中得数字类型不能包含所有的java long值 */
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
@Configuration
public class JacksonConfig {
/** * Jackson全局转化long类型为String,解决jackson序列化时long类型缺失精度问题 * @return Jackson2ObjectMapperBuilderCustomizer 注入的对象 */
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}
}
后面受到启发可以在bootstrap.yml添加以下配置:
spring:
jackson:
#将所有的number类型转为String返回
generator:
write_numbers_as_strings: true
#格式化返回时间 yyyy-MM-dd HH:mm:ss
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8