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 枚举使用的坑整理是指在使用 Spring Boot 枚举时可能出现的一些问题和解决方法的总结。枚举类型是一种特殊的数据类型,它具有固定的值,且这些值不会被修改。在 Java 中...
在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...
此外,将枚举转换为List也是常见的需求。例如,我们可能需要在前端展示所有可能的状态。可以创建一个静态方法来实现这个功能: ```java public enum Status { // ... public static List<Status> getAll() { ...
在Spring Boot集成MyBatis的项目中,我们经常会遇到实体类中的字段是枚举类型,而数据库中的对应字段是整型或字符串型的情况。这种情况下,我们需要进行枚举与数据库字段之间的映射处理,以便正确地保存和读取数据。...
在Spring Boot项目中,枚举类型(Enums)的使用是一种常见的数据表示方式,它们提供了类型安全和可维护性。本文将深入探讨如何在Spring Boot应用中实现枚举类型的最佳实践,包括前端与后端交互、数据库操作以及序列...
本篇文章将详细介绍如何在Spring Boot和MyBatis中实现枚举的自动转换,从而简化这一过程。 首先,我们需要创建枚举类。枚举类通常包含若干个枚举常量,每个常量代表一个特定的业务含义。例如: ```java public ...
为了实现自定义的参数解析逻辑,Spring Boot提供了`HandlerMethodArgumentResolver`接口,允许我们扩展其功能。这个接口使得我们可以解析并绑定自定义类型的参数,例如自定义的枚举类型、复杂对象等。 首先,让我们...
本项目示例"1.springboot+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景"着重展示了如何在Spring Boot应用中集成MyBatis,并利用MyBatis处理枚举类型的数据。 首先,我们来了解Spring Boot。...
本文将深入探讨Spring Boot的环境属性占位符解析以及类型转换的过程,帮助你更好地理解和利用这些功能。 首先,让我们来看一下属性占位符解析。在Spring Boot中,属性可以引用其他属性,通过`${}`语法实现,例如`${...
Spring Boot 自定义返回错误码错误信息 在 Spring Boot 中,自定义返回错误码错误信息是一个非常重要的功能,这可以帮助开发者更好地处理错误信息,并将错误信息返回给调用端。本文将主要介绍如何在 Spring Boot 中...
总之,自定义属性编辑器是Spring框架中一个非常实用的特性,它允许我们扩展和定制数据转换逻辑,以适应各种复杂的需求。通过理解和熟练运用自定义属性编辑器,开发者可以更好地利用Spring的IoC功能,提高代码的灵活...
在Spring Boot应用中,处理Excel文件的导出、导入和生成是常见的需求,尤其是在数据分析、报表生成和数据迁移等场景。下面将详细讲解如何在Spring Boot项目中实现这些功能。 ### 1. Excel导出 要导出Excel文件,...
本示例项目"springboot-fastjson-auto-transform-enum.zip"显然是关于如何在Spring Boot中利用Fastjson进行自定义的枚举(Enum)转换。以下是对这个主题的详细说明: 1. **Fastjson简介** Fastjson是Java语言编写...
- 结合Spring Boot Actuator等工具,可以实现更全面的服务监控。 8. **测试与调试**: - 利用Spring的`@Profile`注解和Maven的 profiles,可以方便地在开发环境中运行Thrift服务,而在生产环境中使用不同的配置。...
3. **枚举(Enum)的序列化**:默认情况下,Jackson将枚举转换为它们的全名或它们在枚举类中的位置(基于索引)。然而,这可能不符合实际业务需求,例如,我们可能希望枚举值映射到特定的字符串。 4. **自定义序列...
例如,可以使用Spring Boot快速搭建应用,也可以选择Spring Cloud进行微服务架构的构建等。 #### 1.3.1 依赖管理和命名规约 为了方便管理项目的依赖关系,Spring推荐使用以下几种依赖管理工具: - **Spring依赖**...
对于日期、大文本、二进制文本和枚举字段的处理,JPA会自动进行转换,使它们能够在数据库中正确存储和检索。 在“JPA_Dome”压缩包中,可能包含了上述示例的完整代码,你可以下载并运行这些代码以加深理解。通过...
- **微服务架构**: 在微服务架构中,Spring Boot和Spring Cloud等项目提供了强大的支持。 - **Web应用**: Spring MVC是构建Web应用的标准框架之一。 #### 二、Spring 3.0新特性及增强 ##### 2.1 Java 5兼容性 - **...
在实际应用中,下拉列表的选择可以通过HTML和CSS创建,然后通过JavaScript或jQuery与后端(如Python的Flask或Django,Java的Spring Boot等)进行交互,将用户选择的日期发送到服务器,服务器处理后返回对应的星期数...
Spring Boot简化了Spring应用的初始搭建以及开发过程,面试时可能遇到的问题有自动配置原理、起步依赖、Spring Boot Actuator监控、Spring Boot与外部配置源的集成、健康检查接口等。Spring Cloud则是微服务治理的一...