美文网首页
springboot 接口枚举属性预处理值返回前端

springboot 接口枚举属性预处理值返回前端

作者: jeffrey_hjf | 来源:发表于2022-01-14 16:36 被阅读0次
在平常接口返回前端数据时,如遇到枚举属性时(`枚举值属性`或者`枚举属性`)需要返回前端,前端只需要具体展示的值,那么就需要针对这些属性进行动态转换

一 、公共类

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;

    }
}

八、后记

个人感觉还有两种改进方案

  1. 自定义注解
  2. 自定义注解 + @JsonSerialize

相关文章

网友评论

      本文标题:springboot 接口枚举属性预处理值返回前端

      本文链接:https://www.haomeiwen.com/subject/qvwacrtx.html