枚舉是一個很好的結構,可以在我們的應用程式域內定義一組有限且定義明確的值。它們可以幫助防止我們的程式碼庫中出現不可能的狀態。
讓我們以筆記 Web 應用程式為例來展示序列化和反序列化 eum 值的可能方法。
我們將使用 Spring Boot 3.3.x 和 MongoDB 來實現它。
我們定義一個 Type 枚舉類別來表示應用程式內允許的待辦事項類型:事件和活動。
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; ... ... }
我們將分析以下場景中的枚舉序列化:
在這種情況下,我們只需要一個反序列化方法,因為我們感興趣的是從字串值轉換為枚舉。
以下是表示按類型讀取所有待辦事項的控制器方法的程式碼片段,類型作為查詢參數傳遞。
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 將欄位標記為用於序列化枚舉的值。
然後我們應該在枚舉內新增一個靜態映射,以將類型與相關的字串表示形式進行映射。
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 文件中列舉的序列化/反序列化,我們必須使用 @ValueConverter 註釋,將文件的欄位與特定的 PropertyValueConverter 類別綁定。
在範例中,欄位 Type 類型與 MongoEnumConverter 綁定,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 方法中,我們從枚舉類別呼叫 Type.fromString 來嘗試將字串轉換為有效的 Type 實例。
public enum Type { EVENT("event"), ACTIVITY("activity"); private Type(String value) { this.value = value; } public String getValue() { return value; } }
在本文中,我介紹了一些在典型 Web 場景中管理枚舉類別的序列化/反序列化的方法。 Spring 和 Jackson 函式庫提供了一些工具來簡化這項工作。
程式碼在此 Gitlab 儲存庫中公開可用。
本文中提供的程式碼已獲得 CC0 授權。
以上是在 Spring Boot Web 應用程式中序列化枚舉的詳細內容。更多資訊請關注PHP中文網其他相關文章!