因alibaba阿里巴巴开发手册规定

【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚 举类型或者包含枚举类型的 POJO 对象。

所以就用这个方式返回枚举中的其他方法

首先需要添加一个接口给到枚举类实现

import com.common.utils.i18n.I18nUtils;
import com.fasterxml.jackson.annotation.JsonProperty;

public interface BaseEnum {

  /**
   * 获取I8N国际化key
   *
   * @return code
   */
  String key();

  /**
   * 获取存入数据库的值
   *
   * @return value
   */
  String value();

  /**
   * 获取I18N国际化信息
   *
   * @return 国际化信息
   */
  @JsonProperty("Description")
  default String getDescription() {
    return I18nUtils.getEnumMessage(key());
  }

  @JsonProperty("Value")
  default String getValue() {
    return value();
  }
}

然后创建一个注解提供给到序列化识别并获取参数

import com.common.comment.impl.EnumSerializer;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 枚举序列化返回参数
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@JacksonAnnotationsInside
@JsonSerialize(using = EnumSerializer.class)
public @interface JaskonEnum {

  Class<?> enumClass();

  String methodName();
}

最后就是jackJson的序列化

import com.common.base.code.BaseExceptionCode;
import com.common.base.enums.BaseEnum;
import com.common.base.excetion.BaseException;
import com.common.comment.JaskonEnum;
import com.common.utils.logger.LoggerUtils;
import com.common.utils.verification.ValidateUtils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.slf4j.Logger;

public class EnumSerializer extends JsonSerializer<String> implements ContextualSerializer {

  private Logger logger = LoggerUtils.logger(getClass());

  private Map<String, String> valueLabelMap;

  public EnumSerializer() {
  }

  public EnumSerializer(Map<String, String> valueLabelMap) {
    this.valueLabelMap = valueLabelMap;
  }

  @Override
  public void serialize(String o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
      throws IOException {
    if (ValidateUtils.isEmpty(valueLabelMap)) {
      return;
    }
    jsonGenerator.writeString(o);
    String values = valueLabelMap.get(o);
    if (ValidateUtils.isEmpty(values)) {
      return;
    }
    String[] split = values.split(":");
    jsonGenerator.writeStringField(split[0], split[1]);
  }

  @Override
  public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty)
      throws JsonMappingException {
    if (ValidateUtils.isEmpty(beanProperty)) {
      return serializerProvider.findNullValueSerializer(beanProperty);
    }

    if (!Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
      return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
    }

    JaskonEnum enumLabel = beanProperty.getAnnotation(JaskonEnum.class);
    if (ValidateUtils.isEmpty(enumLabel)) {
      return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
    }
    // key:getValue value:getLabel
    // 枚举类的成员
    BaseEnum[]          enumInstances = (BaseEnum[]) enumLabel.enumClass().getEnumConstants();
    Map<String, String> map           = new HashMap<>(enumInstances.length);
    try {
      String prefix = enumLabel.methodName();
      for (BaseEnum baseEnum : enumInstances) {
        String value       = baseEnum.getValue();
        String description = baseEnum.getDescription();
        map.put(value, new StringBuilder().append(prefix).append(":").append(description).toString());
      }
    } catch (Exception e) {
      logger.error("jackJson 转义注解失败,失败异常为 e:{}",e);
      throw new BaseException(BaseExceptionCode.BASE_EXCETION_CODE);
    }
    return new EnumSerializer(map);
  }

这样子即可实现返回枚举参数同时,一并返回enum中的getDescription出去,如果需要返回多个参数可以修改baseEnum增加方法