ホームページ > Java > &#&チュートリアル > Spring Boot Web アプリケーションでの列挙型のシリアル化

Spring Boot Web アプリケーションでの列挙型のシリアル化

Patricia Arquette
リリース: 2025-01-09 06:34:43
オリジナル
400 人が閲覧しました

Serializing an enum in a Spring Boot web application

Enum は、アプリケーションのドメイン内で限定的で明確に定義された値のセットを定義するのに適した構造です。これらは、コードベースで不可能な状態を防ぐのに役立つ可能性があります。

シナリオ

メモをとる Web アプリケーションを例として、eum 値をシリアル化および逆シリアル化する方法を示してみましょう。

Spring Boot 3.3.x と MongoDB を使用して実装します。

アプリケーション内で許可される todo のタイプ (イベントとアクティビティ) を表す Type enum クラスを定義します。

public enum Type {
    EVENT("event"),
    ACTIVITY("activity");

    private Type(String value) {
       this.value = value;
    }

   public String getValue() {
       return value;
    }

}
ログイン後にコピー
ログイン後にコピー

私たちの Todo クラス

public class Todo {

    private String id;
    private String name;
    private boolean completed;

    private Type type;

    ...
    ...

}

ログイン後にコピー

次のシナリオで列挙型シリアル化を分析します。

  1. クエリパラメータとして列挙型。
  2. JSON 本文リクエストの一部としての列挙型。
  3. MongoDB ドキュメントのフィールドとしての列挙型。

クエリパラメータとしての列挙型

このシナリオでは、文字列値から列挙型への変換に興味があるため、デシリアライズ メソッドのみが必要です。

すべての todo をタイプ別に読み取るコントローラー メソッドを表すコード スニペットの下では、タイプがクエリ パラメーターとして渡されます。

 public Collection<Todo> read(@RequestParam(required = false) Type type) {
     ...
     ...
 }
ログイン後にコピー

クエリ パラメータは文字列であるため、それを変換するには適切なコンバータを定義する必要があります。
Convert メソッド内で、列挙クラスで作成された静的メソッドである Type.fromString を呼び出します。これは他のシナリオでも使用されます。 fromString メソッドのコードは次のシナリオで示されます。

public class StringToType implements Converter<String, Type> {

    @Override
    public Type convert(String source) {
        return Type.fromString(source);
    }

}
ログイン後にコピー

コンバーターはアプリケーションに登録する必要があります。

@Configuration
public class Config implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToType());
        WebMvcConfigurer.super.addFormatters(registry);
    }
}
ログイン後にコピー

Type を RequestParam として使用する場合、StringToType コンバーターを使用して列挙型の文字列値の変換を試みます。

JSON 本文リクエストの一部としての列挙型

列挙型を JSON 本文コンテンツのフィールドとして正しく管理するには、列挙型 Type クラスにコードを追加する必要があります。

注釈 @JsonValue を使用して、フィールドを列挙型のシリアル化に使用する値としてマークする必要があります。
次に、列挙型内に静的マップを追加して、Type を関連する文字列表現にマップする必要があります。

public enum Type {
    EVENT("event"),
    ACTIVITY("activity");

    @JsonValue
    private String value;

    private static Map<String, Type> enumMap;

    private Type(String value) {
        this.value = value;
    }

    static {
        enumMap = Stream.of(values()).collect(Collectors.toMap(t -> t.value, t -> t));
    }

    public static Type fromString(String value) {
        return enumMap.get(value);
    }

    public String getValue() {
        return value;
    }

}
ログイン後にコピー

MongoDB ドキュメントのフィールドとしての列挙型。

MongoDB ドキュメント内の列挙型のシリアル化/逆シリアル化を管理するには、ドキュメントのフィールドを特定の PropertyValueConverter クラスにバインドする @ValueConverter アノテーションを使用する必要があります。

この例では、フィールド Type タイプは、変換を管理するための読み取りおよび書き込みメソッドを提供する MongoEnumConverter にバインドされています。

@Document(collection = "todo")
@TypeAlias("todo")
public class Todo {

    @Id
    private String id;
    private String name;
    private boolean completed;

    @ValueConverter(MongoEnumConverter.class)
    private Type type;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isCompleted() {
        return completed;
    }

    public void setCompleted(boolean completed) {
        this.completed = completed;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

}
ログイン後にコピー

read メソッドの詳細については、enum クラスから Type.fromString を呼び出して、文字列を有効な Type インスタンスに変換しようとします。

public enum Type {
    EVENT("event"),
    ACTIVITY("activity");

    private Type(String value) {
       this.value = value;
    }

   public String getValue() {
       return value;
    }

}
ログイン後にコピー
ログイン後にコピー

結論は

この記事では、典型的な Web シナリオで enum クラスのシリアル化/逆シリアル化を管理するいくつかの方法を紹介しました。 Spring と Jackson ライブラリは、この作業を簡素化するための機能をいくつか提供しています。

コードは、この Gitlab リポジトリで公開されています。

この記事で紹介されているコードは CC0 ライセンスの下にあります。

以上がSpring Boot Web アプリケーションでの列挙型のシリアル化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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