# Dreamoo **Repository Path**: sddrjack/dreamoo ## Basic Information - **Project Name**: Dreamoo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-04-30 - **Last Updated**: 2025-07-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dreamoo 枚举类型处理说明 ## 问题背景 在Java后端和前端交互时,枚举类型无法直接序列化和反序列化。前端通常使用整数或字符串表示枚举值,而后端使用Java枚举类型。 ## 解决方案 我们实现了一套完整的枚举类型处理机制,使前端和后端可以无缝交互枚举类型。 ### 核心组件 #### 1. 枚举值注解 `@EnumValue`注解用于标记枚举类中表示值的方法,通常是`getType()`或`getValue()`方法。 ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EnumValue { } ``` #### 2. JSON序列化器 `EnumJsonSerializer`负责将枚举类型序列化为整数或字符串,优先使用`getType()`方法的返回值。 #### 3. JSON反序列化器 `EnumJsonDeserializer`负责将整数或字符串反序列化为枚举类型,优先尝试匹配`getType()`方法。 #### 4. 枚举类型转换器 `EnumConverterConfig`定义了两个转换器: - `IntegerToEnumConverter`:将整数转换为枚举 - `StringToEnumConverter`:将字符串转换为枚举 ### 使用示例 #### 枚举类定义 ```java @Getter @AllArgsConstructor @NoArgsConstructor public enum LoginType { QQ_EMAIL_LOGIN(1,"QQ邮箱登录"), WX_LOGIN(2,"微信登录"), PASS_WORD_LOGIN(3,"用户密码登录"); private Integer type; private String desc; @EnumValue public Integer getType() { return type; } } ``` #### 前端发送数据 ```json { "userName": "test_user", "passWord": "123456", "code": "", "loginType": 3 } ``` #### 后端接收和处理 ```java @PostMapping("/login") public Result login(@RequestBody UserLoginDTO userLoginDTO) { // userLoginDTO.getLoginType() 已自动转换为 LoginType.PASS_WORD_LOGIN switch (userLoginDTO.getLoginType()) { case QQ_EMAIL_LOGIN: // 处理QQ邮箱登录 break; case WX_LOGIN: // 处理微信登录 break; case PASS_WORD_LOGIN: // 处理密码登录 break; } return Result.success("登录成功"); } ``` ## 配置方式 1. 添加`@EnumValue`注解到枚举类的`getType()`方法上 2. 自动注册的配置类会处理其余工作 ## 扩展性 该解决方案支持所有遵循相同模式的枚举类,只需要: 1. 枚举类有一个用于标识值的字段(通常为整数类型) 2. 提供一个获取该值的方法,并用`@EnumValue`注解标记