1. 概要

このチュートリアルでは、Spring BootアプリケーションでJSON日付フィールドをフォーマットする方法を示します。

Spring BootがデフォルトのJSONプロセッサとして使用するJacksonを使用して、日付をフォーマットするさまざまな方法を検討します。

2.2。 使用する @JsonFormat日にち分野

2.1. フォーマットの設定

@JsonFormatアノテーションを使用して、特定のフィールドをフォーマットできます

public class Contact {

    // other fields

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

    // standard getters and setters

}

誕生日フィールドでは、日付のみをレンダリングするパターンを使用し、 lastUpdate フィールドでは、時刻も含めます。

Java 8つの日付タイプを使用しました。これは、時間タイプを処理するのに非常に便利です。

もちろん、 java .util.Date などのレガシータイプを使用する必要がある場合は、同じ方法でアノテーションを使用できます。

public class ContactWithJavaUtilDate {

     // other fields

     @JsonFormat(pattern="yyyy-MM-dd")
     private Date birthday;
     
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private Date lastUpdate;

     // standard getters and setters
}

最後に、@JsonFormatを指定された日付形式で使用してレンダリングされた出力を見てみましょう。

{
    "birthday": "2019-02-03",
    "lastUpdate": "2019-02-03 10:08:02"
}

ご覧のとおり、 @JsonFormat アノテーションを使用すると、特定の日付フィールドをフォーマットするための優れた方法になります。

ただし、フィールドに特定のフォーマットが必要な場合にのみ使用してください。 アプリケーションのすべての日付の一般的な形式が必要な場合は、後で説明するように、これを実現するためのより良い方法があります。

2.2. タイムゾーンの設定

特定のタイムゾーンを使用する必要がある場合は、@ JsonFormattimezone属性を設定できます。

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;

たとえば、 java .time.ZonedDatetime のように、タイプにすでにタイムゾーンが含まれている場合は、これを使用する必要はありません。

3. デフォルト形式の構成

@JsonFormat はそれ自体が強力ですが、フォーマットとタイムゾーンをハードコーディングすると、将来的には問題が発生する可能性があります。

アプリケーションのすべての日付にデフォルトの形式を構成する場合、より柔軟な方法はapplication.propertiesで構成することです。

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

また、JSON日付で特定のタイムゾーンを使用する場合は、そのためのプロパティもあります。

spring.jackson.time-zone=Europe/Zagreb

このようにデフォルトのフォーマットを設定するのは非常に便利で簡単ですが、 このアプローチには欠点があります。 残念ながら、Java8の日付タイプでは機能しません 、 そのような LocalDate LocalDateTime 。 タイプjava.util.Dateまたはjava.util.Calendarのフィールドのフォーマットにのみ使用できます。 しかし、すぐにわかるように、希望があります。

4. ジャクソンのObjectMapperのカスタマイズ

したがって、Java 8つの日付タイプを使用し、でデフォルトの日付形式を設定する場合は、でJackson2ObjectMapperBuilderCustomizerbeanを作成する必要があります。

@Configuration
public class ContactAppConfig {

    private static final String dateFormat = "yyyy-MM-dd";
    private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> {
            builder.simpleDateFormat(dateTimeFormat);
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
        };
    }

}

上記の例は、アプリケーションでデフォルトの形式を構成する方法を示しています。 Beanを定義し、その customize メソッドをオーバーライドして、目的の形式を設定する必要があります。

このアプローチは少し面倒に見えるかもしれませんが、Java8と従来の日付タイプの両方で機能するのは良いことです。

5. 結論

この記事では、Spring BootアプリケーションでJSON日付をフォーマットするいくつかの方法を検討しました。

いつものように、例のソースコードはGitHubにあります。