上一篇说到在枚举当在controller的方法做参数时的坑,解决方法是配置了一个converter,后来想想,如果不闲每次都加一个注解麻烦的话,可以在参数前面加一个注解,添加一个解析器应该也可以解决这个问题。

现在来说说枚举的第二个坑,前提条件和上一篇的一样:就是这个枚举:

@Getter
@AllArgsConstructor
public enum EnumExpenseType implements BaseEnum {
小欢喜(1),
大欢喜(2); private final int value;
}

现在还是把它当参数,但是是做为一个复杂对象的属性来传,这个复杂对象是通过jackjson反序列化得到的。

就是前端传过来一个json串,我们在controller中把它反序列化对象。

就不演示了,直接说结论了,jackson默认是使用索引值ordinal来做映射的,所以还是不能满足我们的需求。

所以不是修改jackson的配置,或对每个枚举做修改,添加一个@JsonCreator,我还是喜欢统一的配置,

直接上代码:

/**
* 解决BaseEnum接收前端json时,应按照value值进行处理,实际是按照索引值处理
*/
@JsonComponent
public class BaseEnumDeserializer extends JsonDeserializer<BaseEnum> {
@Override
public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String currentName = jp.currentName();
Object currentValue = jp.getCurrentValue();
Class findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass()); BaseEnum b = EnumUtil.getEnumByValue(findPropertyType, node.intValue()); return b;
}
}
/**
* @author :hkk
*/
public class AuditHttpMessageConverter extends MappingJackson2HttpMessageConverter { public AuditHttpMessageConverter(ObjectMapper objectMapper) { SimpleModule simpleModule1 = new SimpleModule();
simpleModule1.addDeserializer(BaseEnum.class, new BaseEnumDeserializer());
objectMapper.registerModule(simpleModule1); super.setObjectMapper(objectMapper);
}
}

再配置一个webmvcconfig:

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//替换自带json序列化器
MappingJackson2HttpMessageConverter converter;
Iterator<HttpMessageConverter<?>> it = converters.iterator();
while (it.hasNext()) {
if (ClassUtils.isAssignable(it.next().getClass(), MappingJackson2HttpMessageConverter.class)) {
it.remove();
}
}
converters.add(new MappingJackson2HttpMessageConverter(objectMapper));//BaseEnum反序列化支持
converters.add(new AuditHttpMessageConverter(builder.build()));
}

配置完成。

这是反序列化,那序列化还是有问题,可以在value上打个注解@jsonValue,但如果闲麻烦的话,可以做一个统一的配置, 直接上代码:

/**
* BaseEnum及子类,序列化成json时,指定序列值为getvalue*/
@JsonComponent
public class BaseEnumSerializer extends JsonSerializer<BaseEnum> { @Override
public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.getValue());
}
}

spring boot 枚举使用的坑2的更多相关文章

  1. spring boot 枚举使用的坑3

    上一篇说到spring boot 使用jackson在枚举enum序列化和反序列化的问题, 再来说说在JPA中实体entity使用枚举的问题. 还是这个枚举: @Getter @AllArgsCons ...

  2. spring boot 枚举使用的坑

    java 枚举的功能挺多,但是坑更多,使用的时候要注意.如下面这个枚举. @Getter @AllArgsConstructor public enum EnumExpenseType impleme ...

  3. 部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)

    部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作L ...

  4. 初学spring boot踩过的坑

    一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...

  5. Spring Boot 学习填的坑一

    1.关于springBoot自动扫描规则: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Application"类是指 ...

  6. spring boot & mybatis集合的坑

    因为是使用的mybatis逆向工程自动生成的实体类和dao层,然后在读取某一个表的content字段时出现问题. 问题描述:在mysql数据库里可以直接查询到这个字段的内容,但是使用java相关的方法 ...

  7. 从源码看Spring Security之采坑笔记(Spring Boot篇)

    一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...

  8. spring boot升级到2.x的坑

    升级到spring boot 2.x后,发现了好多坑,现记录下来. 1.pom文件依赖的变化 1.x中,依赖是这样的: <dependency> <groupId>org.sp ...

  9. spring cloud: 升级到spring boot 2.x/Finchley.RELEASE遇到的坑

    spring boot2.x已经出来好一阵了,而且spring cloud 的最新Release版本Finchley.RELEASE,默认集成的就是spring boot 2.x,这几天将一个旧项目尝 ...

随机推荐

  1. SQLite为何要用C语言来开发?

    SQLite 选择 C 语言的理由是?为什么不选择 Go 或者 Rust? C 语言是最好的 SQLite 在 2000 年 5 月 29 日发布,并一直使用 C 语言实现.C 语言一直是实现 SQL ...

  2. PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  3. cocos2d 15款游戏源码

    https://blog.csdn.net/jailman/article/details/78678972

  4. arguments详解——函数内命名参数之映射

    首先,arguments对象是所有(非箭头)函数中都可用的局部变量.你可以使用arguments对象在函数中引用函数的参数.此对象包含传递给函数的每个参数,第一个参数在索引0处. arguments对 ...

  5. js测试用

    一,大纲 二,目录二 三,目录三

  6. 【Spark机器学习速成宝典】基础篇02RDD常见的操作(Python版)

    目录 引例入门:textFile.collect.filter.first.persist.count 创建RDD的方式:parallelize.textFile 转化操作:map.filter.fl ...

  7. .net sqlite 内存溢出 问题的分析与解决。

    一个小的工具网站,用了sqlite数据库,在并发小的情况一切正常,但是并发量上来之后,就报"out of memory"错误了. 分析了代码,就是很简单的根据一个条件取一段数据,并 ...

  8. ubuntu 18.04更换源

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak //备份 sudo vim /etc/apt/sources.list //修改 ##阿 ...

  9. Python深度学习读书笔记-5.Keras 简介

    Keras 重要特性 相同的代码可以在 CPU 或 GPU 上无缝切换运行. 具有用户友好的 API,便于快速开发深度学习模型的原型. 内置支持卷积网络(用于计算机视觉).循环网络(用于序列处理)以及 ...

  10. Kolla 让 OpenStack 部署更贴心

    目录 目录 Kolla 简介 Kolla & Kolla-ansible 部署 OpenStack 准备操作系统基础环境 准备 Python 基础环境 准备 Docker 基础环境 安装 ko ...