springboot處理long精度丟失的問題


import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.*;

import java.nio.charset.Charset;
import java.util.List;

/**
* @Classname WebConfig
* @Description TODO
* @Date 2021/8/11 9:06 下午
* @Created by zk
*/
@EnableWebMvc
@Configuration
public class WebMVCConfig extends WebMvcConfigurerAdapter {
/*@Override
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);
}*/

@Autowired
public GsonHttpMessageConverter gsonHttpMessageConverter;


@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
stringConverter.setWriteAcceptCharset(false);
converters.add(new ByteArrayHttpMessageConverter());
converters.add(stringConverter);
converters.add(new ResourceHttpMessageConverter(source));
// MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
// jackson2HttpMessageConverter.setObjectMapper();
     converters.add(new AllEncompassingFormHttpMessageConverter());
     converters.add(gsonHttpMessageConverter);
        converters.add(new Jaxb2RootElementHttpMessageConverter());//xml轉換
}

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer){
configurer.favorParameter(false).favorParameter(false);

}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
}

方法二
long數據能表示的范圍比js中number大,在跟前端交互時,這樣也就意味着部分數值在js中存不下(變成不准確的值)

@JsonSerialize(using = ToStringSerializer.class)
將date轉化為秒

public class DateToLongSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeNumber(date.getTime() / 1000);
}
可以使用

com.fasterxml.jackson.core-jackson-databind包里邊
com.fasterxml.jackson.databind.ser.std下類



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM