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; ... ... }
次のシナリオで列挙型シリアル化を分析します。
このシナリオでは、文字列値から列挙型への変換に興味があるため、デシリアライズ メソッドのみが必要です。
すべての 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 本文コンテンツのフィールドとして正しく管理するには、列挙型 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 ドキュメント内の列挙型のシリアル化/逆シリアル化を管理するには、ドキュメントのフィールドを特定の 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 サイトの他の関連記事を参照してください。