Grund:
Der vom Zahlentyp von js unterstützte Maximalwert ist 9007199254740992 (2 hoch 53 - 1). Die Genauigkeit geht nach einem Überlauf verloren, was dazu führt, dass die Werte des vorderen und hinteren Endes inkonsistent sind.
Der Maximalwert des Java-Long-Typs beträgt 9223372036854775807, was viel höher ist als der Maximalwert des JS-Zahlentyps, sodass diese Grube auftritt.
Lösung:
- ID-Typ: ID_WORKER_STR
bedeutet einfach, dass die ID in den String-Typ konvertiert wird und die Datentypen db und generierte ID in den String-Typ geändert werden.
Nachteil: Der Leistungsvorteil des langen Typs wird geopfert.
Sie können dem ID-Feld jeder Entitätsklasse Anmerkungen hinzufügen
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long id;
dritte Lösung
- Die globale Verarbeitung erfolgt durch JSON-Serialisierung. Was an das Front-End übergeben wird, ist eine Zeichenfolge, und was an das Backend übergeben wird, ist immer noch ein langer Typ.
import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.ValueFilter; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import java.util.ArrayList; import java.util.List; /** * @author :XiaoHui Yang * @version : 1.0.0 * @description: 自定义JsonHttpMessageConverter解决long类型id丢精度问题 * @date :Created in 2020/6/28 14:41 * @modified By: */ @Configuration public class CustomFastJsonHttpMessageConverter { @Bean public HttpMessageConverters fastJsonHttpMessageConverters() { FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); List<SerializerFeature> list = new ArrayList<>(); list.add(SerializerFeature.PrettyFormat); list.add(SerializerFeature.WriteMapNullValue); list.add(SerializerFeature.WriteNullStringAsEmpty); list.add(SerializerFeature.WriteNullListAsEmpty); list.add(SerializerFeature.QuoteFieldNames); list.add(SerializerFeature.WriteDateUseDateFormat); list.add(SerializerFeature.DisableCircularReferenceDetect); list.add(SerializerFeature.WriteBigDecimalAsPlain); fastJsonConfig.setSerializerFeatures(list.toArray(new SerializerFeature[list.size()])); fastConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter = fastConverter; fastJsonConfig.setSerializeFilters(new ValueFilter() { @Override public Object process(Object object, String name, Object value) { if ((StringUtils.endsWith(name, "Id") || StringUtils.equals(name,"id")) && value != null && value.getClass() == Long.class) { return String.valueOf(value); } return value; } }); return new HttpMessageConverters(converter); } }
@Configuration public class WebConfig extends WebMvcConfigurationSupport { /*处理返回的long类型前端无法显示问题*/ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); /** * 日期全局格式化 * */ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));//GMT+8 /** * 序列换成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); } /*处理swagger doc.html无法显示问题*/ @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }