首頁 > Java > java教程 > 在 Spring Boot Web 應用程式中序列化枚舉

在 Spring Boot Web 應用程式中序列化枚舉

Patricia Arquette
發布: 2025-01-09 06:34:43
原創
444 人瀏覽過

Serializing an enum in a Spring Boot web application

枚舉是一個很好的結構,可以在我們的應用程式域內定義一組有限且定義明確的值。它們可以幫助防止我們的程式碼庫中出現不可能的狀態。

場景

讓我們以筆記 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;

    ...
    ...

}

登入後複製

我們將分析以下場景中的枚舉序列化:

  1. 枚舉作為查詢參數。
  2. 枚舉作為 JSON 正文請求的一部分。
  3. 枚舉作為 MongoDB 文件的欄位。

枚舉作為查詢參數

在這種情況下,我們只需要一個反序列化方法,因為我們感興趣的是從字串值轉換為枚舉。

以下是表示按類型讀取所有待辦事項的控制器方法的程式碼片段,類型作為查詢參數傳遞。

 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 將欄位標記為用於序列化枚舉的值。
然後我們應該在枚舉內新增一個靜態映射,以將類型與相關的字串表示形式進行映射。

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 文件中列舉的序列化/反序列化,我們必須使用 @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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板