Snowflake-ID-Algorithmus – Lange Typ-ID gibt Front-End-Präzisionsverlust zurück (durch Serialisierung gelöst)

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:

Option eins

  1. 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.

Option II

Sie können dem ID-Feld jeder Entitätsklasse Anmerkungen hinzufügen

	@JsonFormat(shape = JsonFormat.Shape.STRING)
	private Long id;

dritte Lösung

  1. 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/");
        }
    }
    
    

     

Guess you like

Origin blog.csdn.net/WXF_Sir/article/details/109778231#comments_27906823