`
hpgary
  • 浏览: 78689 次
  • 性别: 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 示例 官方 Demo

    spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决...

    Spring Boot 2 Recipes

    获取Spring Boot 2微框架的可重用代码配方和代码段 了解Spring Boot 2如何与其他Spring API,工具和框架集成 访问Spring MVC和新的Spring Web Sockets,以实现更简单的Web开发 使用微服务进行Web服务开发并与Spring ...

    基于 Spring Boot + MySQL 开发的博客系统源码.zip

    基于 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 Beginning Spring Boot 2

    基于spring boot餐厅管理系统源码.zip

    基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 ...

    Beginning Spring Boot 2 Applications and Microservices with the Spring Framework

    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第2版-2009-EPUB版

    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 cloud和Spring boot介绍

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...

    Spring Boot视频教程大合集,完美帮助你学习Spring Boot,百度网盘

    Spring Boot视频教程大合集,完美帮助你学习Spring Boot,内部有3套Spring Boot学习视频教程,另附一篇Security Oauth2.0认证授权视频教程

    基于Spring Boot 3.0、 Spring Cloud 2022 & Alibaba 的微服务RBAC 权限管理系统

    介绍一个基于Spring Boot 3.0、Spring Cloud 2022 & Alibaba的微服务RBAC权限管理系统。该系统可以实现微服务RBAC权限管理,通过RBAC权限管理机制对用户访问系统的权限进行限制,从而提高系统的安全性和可用性。同时...

    Spring Boot 2.X 实战教程.pdf

    本课程内容包括Spring简介、Spring Boot简介、安装JDK、安装Maven、第一个Spring Boot程序(使用Spring Initializr构建、Spring Boot代码讲解、安装Notepad++)、构建系统、代码、配置、三种方式运行程序、安装...

    Pro Spring Boot(Apress,2016)

    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)

    《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 最佳实践.pdf

    Spring Boot 视频 两套

    Spring Boot 视频 两套 包括基础一套视频和进阶一套视频

    Spring Boot实战派(源码)

    Spring Boot实战派(源码)

    Spring Boot Examples

    Spring boot使用的各种示例,以最简单、最实用为标准 spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-...

    spring boot 42讲配套源码.zip

    第 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 课 ...

Global site tag (gtag.js) - Google Analytics