雪花アルゴリズムピット-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タイプ である.
読んでくれてありがとう.役に立つことを願っています.
理由:
jsのnumberタイプがサポートする最大値は9007199254740992(2の53次方-1)であり、オーバーフロー後の精度が失われ、前後端の値が一致しない.JAvaのlongタイプの最大値は922337203685475807で、js numberタイプの最大値をはるかに上回っているので、このピットが現れました.
ソリューション:
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);
}
}
読んでくれてありがとう.役に立つことを願っています.