spring cloud 枚举json互转 枚举json序列化/反序列化

先定义一个枚举基类

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 查看本文章

猜你喜欢

转载自www.cnblogs.com/binz/p/9178988.html