`
hpgary
  • 浏览: 81976 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring boot 枚举转换

    博客分类:
  • Java
 
阅读更多

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 枚举使用的坑整理是指在使用 Spring Boot 枚举时可能出现的一些问题和解决方法的总结。枚举类型是一种特殊的数据类型,它具有固定的值,且这些值不会被修改。在 Java 中...

    boot+mybatis、mybatis中枚举转换器、前后端分离项目统一返回格式、boot集成quraz框架实现定时任务

    在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...

    java enum 枚举的spring boot2.x完美实现demo源码

    此外,将枚举转换为List也是常见的需求。例如,我们可能需要在前端展示所有可能的状态。可以创建一个静态方法来实现这个功能: ```java public enum Status { // ... public static List&lt;Status&gt; getAll() { ...

    spring boot mybatis枚举映射示例代码

    在Spring Boot集成MyBatis的项目中,我们经常会遇到实体类中的字段是枚举类型,而数据库中的对应字段是整型或字符串型的情况。这种情况下,我们需要进行枚举与数据库字段之间的映射处理,以便正确地保存和读取数据。...

    springboot项目中枚举类型的最佳实践

    在Spring Boot项目中,枚举类型(Enums)的使用是一种常见的数据表示方式,它们提供了类型安全和可维护性。本文将深入探讨如何在Spring Boot应用中实现枚举类型的最佳实践,包括前端与后端交互、数据库操作以及序列...

    springboot--mybatis枚举自动转换实现.rar

    本篇文章将详细介绍如何在Spring Boot和MyBatis中实现枚举的自动转换,从而简化这一过程。 首先,我们需要创建枚举类。枚举类通常包含若干个枚举常量,每个常量代表一个特定的业务含义。例如: ```java public ...

    Spring boot 自定义参数解析器

    为了实现自定义的参数解析逻辑,Spring Boot提供了`HandlerMethodArgumentResolver`接口,允许我们扩展其功能。这个接口使得我们可以解析并绑定自定义类型的参数,例如自定义的枚举类型、复杂对象等。 首先,让我们...

    1.springbood+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景

    本项目示例"1.springboot+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景"着重展示了如何在Spring Boot应用中集成MyBatis,并利用MyBatis处理枚举类型的数据。 首先,我们来了解Spring Boot。...

    Spring Boot环境属性占位符解析及类型转换详解

    本文将深入探讨Spring Boot的环境属性占位符解析以及类型转换的过程,帮助你更好地理解和利用这些功能。 首先,让我们来看一下属性占位符解析。在Spring Boot中,属性可以引用其他属性,通过`${}`语法实现,例如`${...

    Spring Boot 如何自定义返回错误码错误信息

    Spring Boot 自定义返回错误码错误信息 在 Spring Boot 中,自定义返回错误码错误信息是一个非常重要的功能,这可以帮助开发者更好地处理错误信息,并将错误信息返回给调用端。本文将主要介绍如何在 Spring Boot 中...

    Spring学习笔记(11)----自定义属性编辑器

    总之,自定义属性编辑器是Spring框架中一个非常实用的特性,它允许我们扩展和定制数据转换逻辑,以适应各种复杂的需求。通过理解和熟练运用自定义属性编辑器,开发者可以更好地利用Spring的IoC功能,提高代码的灵活...

    springboot 导出excel 导入excel 生成excel 内容有点多

    在Spring Boot应用中,处理Excel文件的导出、导入和生成是常见的需求,尤其是在数据分析、报表生成和数据迁移等场景。下面将详细讲解如何在Spring Boot项目中实现这些功能。 ### 1. Excel导出 要导出Excel文件,...

    springboot-fastjson-auto-transform-enum.zip

    本示例项目"springboot-fastjson-auto-transform-enum.zip"显然是关于如何在Spring Boot中利用Fastjson进行自定义的枚举(Enum)转换。以下是对这个主题的详细说明: 1. **Fastjson简介** Fastjson是Java语言编写...

    Thrift-server与spring集成

    - 结合Spring Boot Actuator等工具,可以实现更全面的服务监控。 8. **测试与调试**: - 利用Spring的`@Profile`注解和Maven的 profiles,可以方便地在开发环境中运行Thrift服务,而在生产环境中使用不同的配置。...

    springboot-jackson-auto-transform-enum.zip

    3. **枚举(Enum)的序列化**:默认情况下,Jackson将枚举转换为它们的全名或它们在枚举类中的位置(基于索引)。然而,这可能不符合实际业务需求,例如,我们可能希望枚举值映射到特定的字符串。 4. **自定义序列...

    spring帮助文档

    例如,可以使用Spring Boot快速搭建应用,也可以选择Spring Cloud进行微服务架构的构建等。 #### 1.3.1 依赖管理和命名规约 为了方便管理项目的依赖关系,Spring推荐使用以下几种依赖管理工具: - **Spring依赖**...

    JPA完成单表注解配置说明包括日期,大文本,二进制文本,枚举

    对于日期、大文本、二进制文本和枚举字段的处理,JPA会自动进行转换,使它们能够在数据库中正确存储和检索。 在“JPA_Dome”压缩包中,可能包含了上述示例的完整代码,你可以下载并运行这些代码以加深理解。通过...

    spring3官方参考文档

    - **微服务架构**: 在微服务架构中,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等)进行交互,将用户选择的日期发送到服务器,服务器处理后返回对应的星期数...

    2023java面试宝典

    Spring Boot简化了Spring应用的初始搭建以及开发过程,面试时可能遇到的问题有自动配置原理、起步依赖、Spring Boot Actuator监控、Spring Boot与外部配置源的集成、健康检查接口等。Spring Cloud则是微服务治理的一...

Global site tag (gtag.js) - Google Analytics