web項目中,前端JS使用Java后端傳過來的Long/long會丟失精度。
后端將返回的數據改為String使用即可
第一種
自己建個配置類
extends WebMvcConfigurerAdapter
已經被棄用,直接實現WebMvcConfigurer
該接口就行了
@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);
}
第二種
前提是使用Jackson2
@Configuration
public class JacksonConfig {
/**
* Jackson全局轉化long類型為String,解決jackson序列化時long類型缺失精度問題
* @return Jackson2ObjectMapperBuilderCustomizer 注入的對象
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
Jackson2ObjectMapperBuilderCustomizer cunstomizer = new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
}
};
return cunstomizer;
}
自己項目使用的時候,第二種未能生效。可能是由於不是使用的jackson2??。使用第一種可以,遂采用了第一種