雪花アルゴリズムピット-Longタイプid戻り先端精度喪失(シーケンス化により解決)


ここが見えるのは、あなたがこの穴を踏んだことを示しています.
理由:
jsのnumberタイプがサポートする最大値は9007199254740992(2の53次方-1)であり、オーバーフロー後の精度が失われ、前後端の値が一致しない.JAvaのlongタイプの最大値は922337203685475807で、js numberタイプの最大値をはるかに上回っているので、このピットが現れました.
ソリューション:
  • id-type: ID_WORKER_STRは簡単に言えばidがstringタイプに移行し、dbと生成されたidデータ型がstringタイプに変更された欠点:longタイプの性能優位性
  • を犠牲にした.
  • はjsonシーケンス化によりグローバル処理を行い、フロントエンドに伝達される文字列であり、バックグラウンドには依然としてlongタイプ
  • である.
    
    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);
        }
    }
    
    

    読んでくれてありがとう.役に立つことを願っています.