All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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