因alibaba阿里巴巴kai'fa'shou开发手册规定
【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚
举类型或者包含枚举类型的 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 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
public @interface FastJsonEnum {
Class<? extends Enum> enumClass();
String methodName();
}
最后就是FastJson的序列化
import com.alibaba.fastjson.serializer.AfterFilter;
import com.common.base.code.BaseExceptionCode;
import com.common.base.enums.BaseEnum;
import com.common.base.excetion.BaseException;
import com.common.comment.FastJsonEnum;
import com.common.utils.logger.LoggerUtils;
import com.common.utils.verification.ValidateUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.slf4j.Logger;
/**
* fastJson转换枚举值到json内
*/
public class FastJsonAfterFilter extends AfterFilter {
private Field field = null;
private Logger logger = LoggerUtils.logger(getClass());
@Override
public void writeAfter(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
for (Field field : fields) {
FastJsonEnum enumResult = field.getAnnotation(FastJsonEnum.class);
if (ValidateUtils.isEmpty(enumResult)) {
continue;
}
BaseEnum[] enumInstances = (BaseEnum[]) enumResult.enumClass().getEnumConstants();
try {
String name = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
Method method = o.getClass().getMethod("get" + name);
Object enumStr = method.invoke(o);
for (BaseEnum enumInstance : enumInstances) {
String desc = enumInstance.getDescription();
String label = enumInstance.getValue();
if (String.valueOf(enumStr).equals(label)) {
super.writeKeyValue(enumResult.methodName(), desc);
}
}
} catch (Exception e) {
logger.error("fastJson 转义注解失败,失败异常为 e:{}",e);
throw new BaseException(BaseExceptionCode.BASE_EXCETION_CODE);
}
}
}
}
然后将此方法设置在FastJsonConfig
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
fastJsonConfig.setSerializeFilters(new FastJsonAfterFilter());