先定义一个枚举基类
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.beans.factory.annotation.Autowired;
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之间交互的实体类中的枚举就可以自动正常转换了
扫描二维码关注公众号,回复:
1584125 查看本文章