当前位置: 首页 > news >正文

前端传入数字,后端用枚举接收统一处理

举例:

有性别枚举:

public enum GenderEnum implements BaseCodeEnum {

    male(1,"男"),
    female(2,"女");

    Integer code ;
    String value;

    GenderEnum(Integer code , String value){
        this.code = code;
        this.value = value;

    }
    @Override
    public Integer getCode() {
        return code;
    }

}

后端接收controller和POJO类:

@PostMapping("/body")
    public TestEnumForm test2(@RequestBody TestEnumForm testEnumForm){
        return testEnumForm;
    }

@Data
public class TestEnumForm {

    GenderEnum gender;
}

前端入参:

 

实际效果如图:

 

实现方式

@Slf4j
@Component
public class JacksonEnumCustomizer implements Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.serializerByType(BaseCodeEnum.class, new JsonSerializer<BaseCodeEnum>() {
            @Override
            public void serialize(BaseCodeEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeNumber(value.getCode());
            }
        });
        jacksonObjectMapperBuilder.deserializerByType(Enum.class, new JacksonEnumDeserializer());
    }
}

 

 

@Slf4j
public class JacksonEnumDeserializer extends JsonDeserializer<Enum> {
    @Override
    public Enum deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        Object currentValue = jsonParser.getCurrentValue();
        Class<?> targetClass = currentValue.getClass();
        String value = jsonParser.getText();
        String fieldName = jsonParser.getCurrentName();

        return getEnum(targetClass, value, fieldName);
    }

    public Enum getEnum(Class<?> targetClass, String value, String fieldName) {
        Class<?> propertyClass = ReflectionUtils.findField(targetClass, fieldName).getType();
        Object[] enumConstants = propertyClass.getEnumConstants();
        for (Object enumConstant : enumConstants) {
            if (ClassUtils.isAssignable(BaseCodeEnum.class, propertyClass)) {
                BaseCodeEnum baseCodeEnum = (BaseCodeEnum) enumConstant;
                if (baseCodeEnum.getCode().equals(Integer.valueOf(value))) {
                    return (Enum) enumConstant;
                }
            } else {
                if (((Enum) enumConstant).name().equals(value)) {
                    return (Enum) enumConstant;
                }
            }

        }
        throw new RuntimeException("covert enum error");
    }
}

如果上述方式启动后不生效的话,看下面的解决方式:

https://blog.csdn.net/sj1231984/article/details/117673198

相关文章:

  • Jackson2ObjectMapperBuilderCustomizer不生效解决
  • feign如何启用httpClient、OKhttp
  • easyExcel读数据后在写入另一个excel
  • nginx 丢失端口问题
  • centos 安装docker及docker-compose
  • 多个docker-compose文件共享一个网络
  • idea 远程调试springboot项目
  • spring-cloud-consul配置中心获取指定路径下的配置
  • 将red5项目部署到tomcat下,并且red5项目嵌入到J2EE项目中
  • mysql 本机登录错误提示及解决方法
  • 禅道程序员的10条原则
  • 完全删除MYSQL:windows 7下完全删除MYSQL,windows xp 下完全删除MYSQL
  • 小故事大人生 -----七个顶级心理寓言
  • windows 7下mysql5.5.18主从同步设置
  • Flex+Java项目,Myeclipse环境下“Target runtime Apache Tomcat v6.0 is not defined ” 错误解决方法
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 07.Android之多媒体问题
  • CSS盒模型深入
  • gf框架之分页模块(五) - 自定义分页
  • Git学习与使用心得(1)—— 初始化
  • JavaScript创建对象的四种方式
  • Mysql优化
  • Python打包系统简单入门
  • Spring核心 Bean的高级装配
  • Vue2.x学习三:事件处理生命周期钩子
  • webpack+react项目初体验——记录我的webpack环境配置
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 利用jquery编写加法运算验证码
  • 入门级的git使用指北
  • 使用common-codec进行md5加密
  • 王永庆:技术创新改变教育未来
  • 一份游戏开发学习路线
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #WEB前端(HTML属性)
  • $ git push -u origin master 推送到远程库出错
  • (16)Reactor的测试——响应式Spring的道法术器
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (NSDate) 时间 (time )比较
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)ssm高校实验室 毕业设计 800008
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)kafka实战——kafka源码编译启动
  • (一)插入排序
  • (转)nsfocus-绿盟科技笔试题目
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .net 7 上传文件踩坑
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 将实体类转换为 SQL(ORM 映射)