![JAR search and dependency download from the Maven repository](/logo.png)
com.github.dreamroute.mybatis.pro.base.codec.enums.package-info Maven / Gradle / Ivy
The newest version!
/**
*
* 描述:此包是枚举EnumMarker的序列化和反序列化的jackson实现,
*
* JacksonSerializer的枚举类型可以是EnumMarker,也可以是Enum类型,
*
* 但是JacksonDeserializer的枚举类型就不能是EnumMarker,必须是Enum类型或者是具体的枚举类型,
*
* 开发JacksonDeserializer的灵感来源于这里:https://www.cnblogs.com/kelelipeng/p/13972138.html,
*
* 事实上也可以使用Fastjson方式的序列化和反序列化方式,但是Fastjson在前些年出过几次比较重大的漏洞时间,加上Fastjson源码不够优秀,并且基本上是个人开发者,而jackson是Spring默认的序列化和反序列化工具包。
*
* 使用方式:
* 1. 可以自定义HttpMessageConverter实现WebMvcConfigurer的configureMessageConverters方法,例如:
*
* @Configuration
* public class HttpMsgConverterConfig implements WebMvcConfigurer {
* @Override
* public void configureMessageConverters(@Nonnull List> converters) {
* converters.removeIf(e -> e instanceof MappingJackson2HttpMessageConverter);
*
* SimpleModule module = new SimpleModule();
* module.addSerializer(Enum.class, new JacksonSerializer());
* module.addDeserializer(Enum.class, new JacksonDeserializer());
* simpleModule.addDeserializer(Collection.class, new EnumMarkerDeserializerForCollection());
*
* ObjectMapper om = new ObjectMapper();
* om.registerModule(module);
*
* MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter(om);
* c.setObjectMapper(om);
*
* converters.add(0, c);
* }
* }
*
* 2. 也可以不自定义HttpMessageConverter,直接在EnumMarker头顶上加上序列化和反序列化的注解,例如:
*
* @JsonSerialize(using = JacksonSerializer.class)
* @JsonDeserialize(using = JacksonDeserializer.class)
* public interface EnumMarker extends Serializable {}
*
*
* 3. 对于枚举类型fastjson和jackson选型问题,fastjson存在的问题:
* 1. 列表方式的枚举反序列化会oom;
* 2. 枚举类型传null
会有默认认知0造成业务出错,业务中如果允许Gender为空,前端传{"gender": null},那么gender就是0对应的枚举,而jackson就不会
*
* public class Demo {
* private Gender gender;
* }
*
* 3. 并且通过{@link com.github.dreamroute.mybatis.pro.base.codec.enums.EnumMarkerDeserializerForCollection}能够解决列表方式的枚举问题,而fastjson的oom就不太好解决
* 4. 使用Jackson方式反序列化需要与前端约定:对于空对象,要么不传,要么传null
,不能传空括号,如下json请求不允许:
*
* {
* "user": {}
* "birthday": "1990-05-03"
* }
*
* 因为这样的话,在自定义反序列化对象中,比如EnumMarkerDeserializer、EnumMarkerDeserializerForCollection、DateDeserializer的p.getCurrentValue()
会读取错位,birthday会读取到User.class
* @author w.dehi.2021-12-19
*/
package com.github.dreamroute.mybatis.pro.base.codec.enums;
© 2015 - 2025 Weber Informatics LLC | Privacy Policy