SpringBoot で日付を処理するにはどのような方法がありますか?

PHPz
リリース: 2023-05-16 14:58:06
転載
1470 人が閲覧しました

Spring Boot では、通常、Jackson を使用して Java オブジェクトを JSON にシリアル化および逆シリアル化します。日付のシリアル化を行うときは、日付形式を指定する必要があります。指定しないと、Jackson はデフォルトの形式を使用するため、これが私たちが望んでいる形式ではない可能性があります。日付形式を指定するには、次の 2 つの方法があります:

何も処理しない場合、デフォルトの結果は次のようになります: したがって、何らかの手段で日付を処理する必要があります。 it.

SpringBoot で日付を処理するにはどのような方法がありますか?

方法 1: アノテーションを使用する (推奨されません)

@JsonFormat() をエンティティ クラスの日付属性に追加し、パラメータパターン 希望する形式の例は次のとおりです。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
ログイン後にコピー

この時点で、フロントエンドは設定した形式に従って表示されます

SpringBoot で日付を処理するにはどのような方法がありますか?

上記の場合フロントエンドに表示される日付に @JSONFormat アノテーションを付けるのが非常に面倒なので、方法 2 グローバル例外処理を使用する

方法 2 のカスタム メッセージ コンバータ

最初に、Jackson パッケージの ObjectMapper を紹介します。

ObjectMapper は、Jackson ライブラリのクラスです。その主な機能は次のとおりです:

  • Java オブジェクトを JSON にシリアル化する/XML など 形式;

  • JSON/XML およびその他の形式のデータを Java オブジェクトに逆シリアル化します。

つまり、オブジェクトを JSON/XML に変換することが鍵となります。

次に、このクラスでできることは、

(1) コンストラクターでの日付変換の形式をカスタマイズする ----属性を変更するのと同じです。初期化値。

(2) 呼び出し時に Jackson のカスタム ObjectMapper を呼び出さないように SpringMVC を構成し、カスタム形式を使用します

##これらの 2 つのステップで実装します。 1:

ObjectMapper を継承し、コンストラクターをオーバーライドし、シリアル化メソッドをカスタマイズします。

public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}
ログイン後にコピー

ステップ 2: Spring にカスタム メッセージ コンバーターを使用させます

ここで、次のことを行う必要があります。考えてみてください、どのように対処すればよいでしょうか? どこに設定するのですか? 設定ファイル? 設定クラス? まず最初に考えられるのは、システムに不可欠なものはインターセプタであり、インターセプターにはインターセプト ルールを構成するための構成クラスがありますか? それで、ここで構成できますか?

binggo, right here. インターセプターの構成クラスを構成すると、WebMvcConfigurationSupport クラスに多くのメソッドがあることがわかります。 ,

一般的に使用される

protected void addInterceptors(InterceptorRegistry registry) { ... }

インターセプト ルールの構成

public void addResourceHandlers(ResourceHandlerRegistry registry) {。 .. } リソース処理を構成するための構成方法は多数あります

など。メッセージ コンバーター もその 1 つです

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {...}
ログイン後にコピー

関連情報を構成することでこのメソッドでは、Spring によってデフォルトで指定されているルールを変更し、独自に定義したルール (コンポーネント) を使用できます。 コードは次のとおりです。

@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("扩展消息转换器...");
    //创建一个消息转换器对象,注意不要导错包是Jackson2Http
    MappingJackson2HttpMessageConverter converter =  new MappingJackson2HttpMessageConverter();
    //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
    converter.setObjectMapper(new JacksonObjectMapper());
    //将自己的消息转化器加入容器中
    converters.add(0, converter);
}
ログイン後にコピー

Created a MappingJackson2HttpMessageConverter は、Spring MVC に統合された Jackson メッセージ コンバータであり、Java オブジェクトを JSON にシリアル化/逆シリアル化できます。

  • メッセージ コンバーターに JacksonObjectMapper の使用を指定します。これは、Java オブジェクトを JSON にシリアル化/逆シリアル化するために使用されます。

  • #作成したばかりの MappingJackson2HttpMessageConverter オブジェクトをメッセージ コンバーター リスト コンバーターに追加し、最初に使用できるように最初の位置に追加します

  • extendMessageConverters() メソッドをオーバーライドしたため、Spring MVC はこのメソッドを呼び出し、追加したメッセージ コンバーターを使用します。したがって、追加した MappingJackson2HttpMessageConverter が有効になり、カスタム

    JacksonObjectMapper()

    を使用してオブジェクトと JSON 間のシリアル化と逆シリアル化を処理します。
私たちのメッセージコンバーターは最初のメッセージコンバーターであるため、クライアントが JSON データを返すように要求した場合、Spring MVC はオブジェクトのシリアル化のためにメッセージコンバーターを選択します。

したがって、システム内のすべての日付は、必要な形式に従ってシリアル化されます。

現時点では、フロントエンド データは設定した形式です。これはデフォルトの形式ではなくなりました。

日付が記載されているため、同様の機密情報の処理もあります。

フロントエンド データを返すとき、フロントエンドに見せたくない場合があります。エンティティ クラスの設計により、データ。このとき、何らかの手段、または 2 つの方法でデータを処理する必要があります。

データの値を置き換える前に戻り、set メソッドを呼び出して

スパム情報

に設定します。setPassword(“******”)

  • は、Jackson によって提供されます。エンティティ クラス @JsonIgnore アノテーションも使用できます。 解決策は、フィールドのシリアル化と逆シリアル化を無視することです。

以上がSpringBoot で日付を処理するにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート