在平常接口返回前端数据时,如遇到枚举属性时(`枚举值属性`或者`枚举属性`)需要返回前端,前端只需要具体展示的值,那么就需要针对这些属性进行动态转换
一 、公共类
1. 枚举base类
package com.example.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
public interface BaseEnum {
/**
* 通过枚举类型和code值获取对应的枚举类型
*
* @param enumType
* @param code
* @param <T>
* @return
*/
static <T extends BaseEnum> T valueOf(Class<? extends BaseEnum> enumType, Integer code) {
if (enumType == null || code == null) {
return null;
}
T[] enumConstants = (T[]) enumType.getEnumConstants();
if (enumConstants == null) {
return null;
}
for (T enumConstant : enumConstants) {
Integer enumCode = enumConstant.getCode();
if (code.equals(enumCode)) {
return enumConstant;
}
}
return null;
}
/**
* @param enumType
* @param message
* @param <T>
* @return
*/
static <T extends BaseEnum> T messageOf(Class<? extends BaseEnum> enumType, String message) {
if (enumType == null || message == null) {
return null;
}
T[] enumConstants = (T[]) enumType.getEnumConstants();
if (enumConstants == null) {
return null;
}
for (T enumConstant : enumConstants) {
String enumMessage = enumConstant.toString();
if (message.equals(enumMessage)) {
return enumConstant;
}
}
return null;
}
/**
* 获取枚举标识
*
* @return
*/
Integer getCode();
/**
* 获取枚举描述
*
* @return
*/
String getMessage();
}
2. 需要动态转换的枚举
package com.example.demo;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum DictionaryTypeEnum implements BaseEnum {
PROBLEM_TYPE(1, "问题类型"),
PROBLEM_DOMAIN(2, "问题领域"),
AUTHORITY_SON_TYPE(3, "权力子类型"),
;
private Integer code;
private String message;
}
3. 实体类
package com.example.demo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
@Data
public class User {
private Integer id;
private String userName;
private Integer age;
@JsonSerialize(using = JsonSerializeTest.class)
private DictionaryTypeEnum dictionaryTypeEnum;
@JSONField(serializeUsing = JsonSerializeConvertEnum.class)
private Integer dictionaryType;
}
4. 对应枚举
package com.example.demo;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ModelConvertFieldEnum implements BaseEnum {
dictionaryType(1, "com.example.demo.DictionaryTypeEnum");
private Integer code;
private String message;
}
二、jackson方式 - 枚举属性
package com.example.demo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
@Data
public class User {
private Integer id;
private String userName;
private Integer age;
@JsonSerialize(using = JsonSerializeTest.class)
private DictionaryTypeEnum dictionaryTypeEnum;
@JSONField(serializeUsing = JsonSerializeConvertEnum.class)
private Integer dictionaryType;
}
三、jackson方式 - 值属性
package com.example.demo;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.SneakyThrows;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
public class JsonSerializeConvert extends JsonSerializer<Integer> {
@SneakyThrows
@Override
public void serialize(Integer value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
String resultEnumValue = null;
String currentFiledName = jsonGenerator.getOutputContext().getCurrentName();
BaseEnum baseEnum = BaseEnum.messageOf(ModelConvertFieldEnum.class, currentFiledName);
if (null != baseEnum) {
Class enumClass = Class.forName(baseEnum.getMessage());
BaseEnum businessEnum = BaseEnum.valueOf(enumClass, value);
resultEnumValue = businessEnum == null ? null : baseEnum.getMessage();
}
jsonGenerator.writeString(resultEnumValue);
}
}
四、fastjson方式 - 枚举属性
package com.example.demo;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import java.lang.reflect.Type;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/14
*/
public class JsonSerializeConvertEnum implements ObjectSerializer {
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) {
BaseEnum baseEnum = (BaseEnum) o;
jsonSerializer.write(baseEnum.getMessage());
}
}
五、fastjson方式 - 值属性
package com.example.demo;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import lombok.SneakyThrows;
import java.lang.reflect.Type;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/14
*/
public class JsonSerializeConvertEnum implements ObjectSerializer {
@SneakyThrows
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) {
String resultEnumValue = null;
BaseEnum baseEnum = BaseEnum.messageOf(ModelConvertFieldEnum.class, o1.toString());
if (null != baseEnum) {
Class enumClass = null;
enumClass = Class.forName(baseEnum.getMessage());
BaseEnum businessEnum = BaseEnum.valueOf(enumClass, Integer.parseInt(o.toString()));
resultEnumValue = businessEnum == null ? null : businessEnum.getMessage();
}
jsonSerializer.write(resultEnumValue);
}
}
六、fastjson方式 - 值属性方式常量表
package xyz.mercs.ares.admin.core.common.constant.model;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/14
*/
public class ModelConvertFieldEnum {
public final String dictionaryType = "xyz.mercs.ares.admin.modular.gxdj.enums.DictionaryTypeEnum";
public final String warnLevel = "xyz.mercs.ares.admin.modular.gxdj.enums.LevelEnum";
public final String handleEfficient = "xyz.mercs.ares.admin.modular.gxdj.enums.ThreeColorEnum";
public final String confirmEfficient = "xyz.mercs.ares.admin.modular.gxdj.enums.ThreeColorEnum";
}
package xyz.mercs.ares.admin.core.common.convert;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import lombok.SneakyThrows;
import xyz.mercs.ares.core.base.enums.BaseEnum;
import java.lang.reflect.Type;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
public class JsonSerializeConvertEnum implements ObjectSerializer {
private final String map = "xyz.mercs.ares.admin.core.common.constant.model.ModelConvertFieldEnum";
@SneakyThrows
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) {
String resultEnumValue = null;
Class<?> aClass = Class.forName(map);
Object enumClassPath = aClass.getDeclaredField(o1.toString()).get(aClass.newInstance());
if (null != enumClassPath) {
Class enumClass = Class.forName(enumClassPath.toString());
BaseEnum businessEnum = BaseEnum.valueOf(enumClass, Integer.parseInt(o.toString()));
resultEnumValue = businessEnum == null ? null : businessEnum.getMessage();
}
jsonSerializer.write(resultEnumValue);
}
}
七、集成测试
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author jeffrey
* @version 1.0
* @date 2022/1/13
*/
@RestController
public class UserController {
@GetMapping("/getuser")
public Object getuser() {
User user = new User();
user.setUserName("线三");
user.setAge(18);
user.setDictionaryTypeEnum(DictionaryTypeEnum.AUTHORITY_SON_TYPE);
user.setDictionaryType(1);
return user;
}
}
八、后记
个人感觉还有两种改进方案
- 自定义注解
- 自定义注解 + @JsonSerialize
网友评论