因alibaba阿里巴巴開發手冊規定java
【強制】二方庫裏能夠定義枚舉類型,參數能夠使用枚舉類型,可是接口返回值不容許使用枚
舉類型或者包含枚舉類型的 POJO 對象。
數據庫
因此就用這個方式返回枚舉中的其餘方法json
首先須要添加一個接口給到枚舉類實現app
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(); } }
而後建立一個註解提供給到序列化識別並獲取參數ide
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的序列化ui
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增長方法this