先定义一个枚举基类
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@JsonDeserialize(using = BaseEnumDeserializer.class)
public interface BaseEnum extends Serializable{
/**
* 调用枚举的this.name()
* @return
*/
String getCode();
static <E extends Enum<E> & BaseEnum> E valueOf(String enumCode,Class<E> clazz) {
E enumm = Enum.valueOf(clazz, enumCode);
return enumm;
}
}
定义自己的枚举并且实现 BaseEnum
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 通用状态
* @author xxx
* 2018年3月26日 上午9:53:51
*/
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum CommonStatus implements BaseEnum{
CREATE("新建"),
ENABLED("启用"),
DISABLED("禁用"),
DELETE("删除")
;
private CommonStatus(String displayName) {
this.displayName = displayName;
}
private String displayName;
public String getCode(){
return this.name();
}
public String getDisplayName() {
return this.displayName;
}
}
自定义枚举转换器
import org.springframework.beans.BeanUtils;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
/**
* 解决 spring cloud json 转枚举问题
* @author xxxx
* 2018年6月13日 下午5:30:02
*/
public class BaseEnumDeserializer extends JsonDeserializer<BaseEnum>{
@Override
@SuppressWarnings("unchecked")
public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String currentName = jp.currentName();
Object currentValue = jp.getCurrentValue();
@SuppressWarnings("rawtypes")
Class findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass());
JsonFormat annotation = (JsonFormat) findPropertyType.getAnnotation(JsonFormat.class);
BaseEnum valueOf;
if(annotation == null || annotation.shape() != Shape.OBJECT) {
valueOf = BaseEnum.valueOf(node.asText(), findPropertyType);
}else {
valueOf = BaseEnum.valueOf(node.get("code").asText(),findPropertyType);
}
return valueOf;
}
}
入口处给注册转换器
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.replace_common.mproject.core.enums.BaseEnum;
import com.replace_common.mproject.core.enums.BaseEnumDeserializer;
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableFeignClients //启动远程调用,调用其他项目的接口
public class ComputeServiceApplication implements ApplicationListener<ContextRefreshedEvent> {
private boolean isExecut;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if(!isExecut) {
ApplicationContext applicationContext = event.getApplicationContext();
//注册转换器
SimpleModule module = new SimpleModule();
JsonDeserializer<BaseEnum> deserialize = new BaseEnumDeserializer();
module.addDeserializer(BaseEnum.class, deserialize);
ObjectMapper bean = applicationContext.getBean(ObjectMapper.class);
bean.registerModule(module);
}
isExecut=true;
}
public static void main(String[] args) {
SpringApplication.run(ComputeServiceApplication.class, args);
}
}
然后spring cloud之间交互的实体类中的枚举就可以自动正常转换了