spring boot 枚举使用的坑2
上一篇说到在枚举当在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的更多相关文章
- spring boot 枚举使用的坑3
上一篇说到spring boot 使用jackson在枚举enum序列化和反序列化的问题, 再来说说在JPA中实体entity使用枚举的问题. 还是这个枚举: @Getter @AllArgsCons ...
- spring boot 枚举使用的坑
java 枚举的功能挺多,但是坑更多,使用的时候要注意.如下面这个枚举. @Getter @AllArgsConstructor public enum EnumExpenseType impleme ...
- 部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)
部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作L ...
- 初学spring boot踩过的坑
一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...
- Spring Boot 学习填的坑一
1.关于springBoot自动扫描规则: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Application"类是指 ...
- spring boot & mybatis集合的坑
因为是使用的mybatis逆向工程自动生成的实体类和dao层,然后在读取某一个表的content字段时出现问题. 问题描述:在mysql数据库里可以直接查询到这个字段的内容,但是使用java相关的方法 ...
- 从源码看Spring Security之采坑笔记(Spring Boot篇)
一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...
- spring boot升级到2.x的坑
升级到spring boot 2.x后,发现了好多坑,现记录下来. 1.pom文件依赖的变化 1.x中,依赖是这样的: <dependency> <groupId>org.sp ...
- spring cloud: 升级到spring boot 2.x/Finchley.RELEASE遇到的坑
spring boot2.x已经出来好一阵了,而且spring cloud 的最新Release版本Finchley.RELEASE,默认集成的就是spring boot 2.x,这几天将一个旧项目尝 ...
随机推荐
- POJ 2155 Matrix (树状数组 && 区间计数)
题意 : 给出一个N*N的矩阵, 矩阵只有可能包含0或1, 一开始则全部是0.对于矩阵可以进行两种操作, 第一种是输入 C x1 y1 x2 y2 表示, 对以(x1, y1)为左上角, 以(x2, ...
- Devexpress MVC GridView / CardView (持续更新)
//获取gridview里面的combo box 显示的文本 //获取某个column在gridview的 index RightGridView.GetColumnByField("Fun ...
- 将DVD.iso 挂载到虚拟机
将DVD.iso挂载到虚机之后,默认设备名是/dev/sr0 挂载DVD.iso文件到/mnt. 操作: mount /dev/sr0 /mnt 查看: ll /mnt
- 【Python】学习笔记五:缩进与选择
Python最具特色的用缩进来标明成块的代码 缩进 i = 4 j = 2 if i > j: i = i+1 print(i) 这是一个简单的判断,Python的if使用很简单,没有括号等繁琐 ...
- insert和insertSelective区别
两者的区别在于如果选择insert 那么所有的字段都会添加一遍即使没有值 <insert id="insert" parameterType="com.ego.po ...
- 网络协议之TCP/IP协议
沙漏计时器型TCP/IP协议族,允许IP on everyting,即支持多种形式和物理层和数据链路层实现:同时支持多种多样的应用层协议,扩展了各式各样的服务. IP协议(网际协议) 与IP协议配套使 ...
- CentOS7 如何挂载网络设备
CentOS 自动挂载网络设备的方法 手动挂载: [root@mysql ~]# mount -o username=USER,password=PASSWORD //192.168.10.212/z ...
- kaptcha Spring 整合
转自:http://my.oschina.net/CandyDesire/blog/209364 生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的 ...
- linux查看硬盘信息
1. 通过内核查看硬盘信息 cat /sys/block/sda/device/model cat /sys/block/sda/device/vendor 2. 用过hdparm命令查看 hdpar ...
- laradock 部署 php 环境 和 laravel/lumen 框架
环境是windows 10 版本1809,docker 版本18.09.0 首先是下载docker.git, 具体可以参考 http://laradock.io/ 要求 Docker >= 17 ...