枚举是一个很好的结构,可以在我们的应用程序域内定义一组有限且定义明确的值。它们可以帮助防止我们的代码库中出现不可能的状态。
让我们以笔记 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中文网其他相关文章!