1、所有枚举使用实现一个通用接口
例如:
public interface BaseEnum { Integer getCode() ; String getMessage() ; }
枚举定义:
public enum SexType implements BaseEnum{ MEN(1, "男"), WOMAN(2, "女"), NONE(0, "未知"); private int code; private String text; SexType(int code, String text) { this.code = code; this.text = text; } public Integer getCode() { return code; } public String getMessage() { return text; } }
2、定义枚举转换工厂
public class EnumConverterFactory implements ConverterFactory<String,BaseEnum> { private static final Map<Class, Converter> converterMap = new WeakHashMap<>(); @Override public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) { Converter result = converterMap.get(targetType); if(result == null) { result = new ConverterToEnum<>(targetType); converterMap.put(targetType, result); } return result; } class ConverterToEnum<T extends BaseEnum> implements Converter<String, T> { private final Class<T> enumType; private Map<String, T> enumMap = new HashMap<>(); public ConverterToEnum(Class<T> enumType) { this.enumType = enumType; T[] enums = enumType.getEnumConstants(); for(T e : enums) { enumMap.put(e.getCode() + "", e); } } @Override public T convert(String source) { T result = enumMap.get(source); if(result == null) { throw new IllegalArgumentException("No element matches " + source); } return result; } } }
4、注册到spring boot
import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverterFactory(new EnumConverterFactory()); } }
5、spring boot json 响应code转换
import com.bjike.utils.EnumTools; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import org.apache.commons.lang3.math.NumberUtils; import java.io.IOException; @SuppressWarnings({ "rawtypes" }) public class EnumJsonSerializer extends JsonSerializer<Enum> { @Override public void serialize(Enum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (null == value) { return; } int code = NumberUtils.toInt(EnumTools.getInvokeValue(value, "getCode")); if (code == -1) { code = value.ordinal(); } gen.writeString(String.valueOf(code)); } }
MyWebAppConfigurer 类中,新增实现方法
/** * 新增枚举转换器 * json返回枚举数字 * */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.serializationInclusion(JsonInclude.Include.NON_NULL); ObjectMapper objectMapper = builder.build(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Enum.class, new EnumJsonSerializer()); objectMapper.registerModule(simpleModule); objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true); converters.add(new MappingJackson2HttpMessageConverter(objectMapper));}
枚举反射类:EnumTools
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.Method; import java.util.*; public class EnumTools { public static String getText(Class<?> ref , Object code){ return parseEumn(ref).get( String.valueOf(code) ) ; } public static <T> T parseToEumn(Class<T> ref , Integer data){ if(data == null){return null;} T[] ts = ref.getEnumConstants() ; for(T t : ts){ Enum<?> tempEnum = (Enum<?>) t ; int code = NumberUtils.toInt(getInvokeValue(t, "getCode") , -1); if(code == -1){ code = tempEnum.ordinal() ; } if(code == data){ return t ; } } return null ; } public static <T> Map<String, String> parseEumn(Class<T> ref){ Map<String, String> map = new LinkedHashMap<>() ; if(ref.isEnum()){ T[] ts = ref.getEnumConstants() ; for(T t : ts){ String text = getInvokeValue(t, "getMessage") ; Enum<?> tempEnum = (Enum<?>) t ; if(text == null){ text = tempEnum.name() ; } String code = getInvokeValue(t, "getCode") ; if(code == null){ code = String.valueOf( tempEnum.ordinal() ); } map.put(code , text ) ; } } return map ; } public static <T> String getInvokeValue(T t , String methodName){ try { Method method = MethodUtils.getAccessibleMethod( t.getClass() , methodName); String text = String.valueOf(method.invoke( t )) ; return text ; } catch (Exception e) { return null ; } } }
相关推荐
在本篇文章里我们给大家整理了关于spring boot 枚举使用的坑以及相关知识点内容,需要的朋友们学习下。
spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决...
获取Spring Boot 2微框架的可重用代码配方和代码段 了解Spring Boot 2如何与其他Spring API,工具和框架集成 访问Spring MVC和新的Spring Web Sockets,以实现更简单的Web开发 使用微服务进行Web服务开发并与Spring ...
基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring ...
Beginning Spring Boot 2 Beginning Spring Boot 2 Beginning Spring Boot 2
基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 ...
This book will help you understand what Spring Boot is, how Spring Boot helps you build Spring-based applications quickly and easily, and the inner workings of Spring Boot using easy-to-follow ...
Pro Spring Boot 2: An Authoritative Guide to Building Microservices, Web and Enterprise Applications, and Best Practices Quickly and productively develop complex Spring applications and microservices...
Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...
Spring Boot视频教程大合集,完美帮助你学习Spring Boot,内部有3套Spring Boot学习视频教程,另附一篇Security Oauth2.0认证授权视频教程
介绍一个基于Spring Boot 3.0、Spring Cloud 2022 & Alibaba的微服务RBAC权限管理系统。该系统可以实现微服务RBAC权限管理,通过RBAC权限管理机制对用户访问系统的权限进行限制,从而提高系统的安全性和可用性。同时...
本课程内容包括Spring简介、Spring Boot简介、安装JDK、安装Maven、第一个Spring Boot程序(使用Spring Initializr构建、Spring Boot代码讲解、安装Notepad++)、构建系统、代码、配置、三种方式运行程序、安装...
Pro Spring Boot is your authoritative hands-on practical guide for increasing your Spring Framework-based enterprise Java and cloud application productivity while decreasing development time using the...
《Vue Spring Boot前后端分离开发实战》源码 Vue+Spring Boot前后端分离开发实战教学课件(PPT)
Spring Boot 最佳实践.pdf Spring Boot 最佳实践.pdf Spring Boot 最佳实践.pdf Spring Boot 最佳实践.pdf Spring Boot 最佳实践.pdf Spring Boot 最佳实践.pdf
Spring Boot 视频 两套 包括基础一套视频和进阶一套视频
Spring Boot实战派(源码)
Spring boot使用的各种示例,以最简单、最实用为标准 spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-...
第 2-1 课: Spring Boot 对基础 Web 开发支持/spring-boot-web 第 2-10 课: 使用 Spring Boot WebSocket 创建聊天室/spring-boot-websocket 第 2-2 课 Spring Boot 项目中使用 JSP/spring-boot-jsp 第 2-3 课 ...