首页 >Java >java教程 >在 Spring Boot Web 应用程序中序列化枚举

在 Spring Boot Web 应用程序中序列化枚举

Patricia Arquette
Patricia Arquette原创
2025-01-09 06:34:43409浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn