MysqlのBigintがJavaのLong型に転送され、フロントエンドでデータの不整合が表示され、Long型の精度が失われる

1. 問題の説明

データベースの主キーは、スノーフレーク アルゴリズムによって取得された ID で、長さは 18 ~ 19 桁です (例: 575373347886465024)。

現象: データ インベントリは389324381291020288ですが、フロントエンドには389324381291020300が表示され、ID インデックス作成の実行時にデータが存在しません。

デバッグの結果、プログラム内でデータベースに問い合わせた時点ではデータは正常であることがわかりましたが、インターフェイスから出るときにデータが変化しているため、フロントエンドに返す時点で精度が失われているはずです。

理由は問い合わせた結果判明しました:

フィールドエンティティクラスが Long 型で、値がフロントエンド js で表示される長さの範囲を超える場合、フロントエンド エコーでエラーが発生します。

2. 解決策

解決策 1: アノテーション @JsonSerialize を id フィールドに追加する

JsonSerialize アノテーションを使用してシリアル化する場合、次のように Long から String (単一の属性の場合) に自動的に変換されます。

コード:

com.fasterxml.jackson.databind.annotation.JsonSerialize をインポートします。

com.fasterxml.jackson.databind.ser.std.ToStringSerializer をインポートします。

@ApiModelProperty("プロジェクトID")

@JsonSerialize(= ToStringSerializer.class を使用)

プライベートの長いプロジェクト ID ;

解決策 2: グローバルに解決します。解決策は 1 と同じです。グローバル シリアル化を構成します。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

@Configuration
public class JacksonConfig {
    @Bean
    public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
        final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        final ObjectMapper objectMapper = builder.build();
        SimpleModule simpleModule = new SimpleModule();
        // Long 转为 String 防止 js 丢失精度
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        // 忽略 transient 关键词属性
        objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }
}

おすすめ

転載: blog.csdn.net/zzchances/article/details/128900800