Jackson注解的MixIn

Jackson需要根据注解设置一些配置和操作,可能在类、接口、工厂方法、字段上。

mixin的意思是混入,这里的意思是将其它的注解注解混入目标对象中,这个对象可能是类、接口、工厂方法、字段。

为什么需要混入,因为有些类型是外部引入的,自己不可以修改。但json序列化或反序列时又需要注解来定制一些特殊操作。

这时就出现了混入,将另一个类从类本身到内部字段和方法的注解通过混入合并到需要序列化和反序列化的目标类上。

但这个混入合并并不是修改了目标类的结构,只是在jackson层面生成了一个个的映射关系,键名是类型或方法签名,键值是搜集并合并的所有注解。

所以混入的注解在jackson层面有效,因为这个映射关系只保存在它这里,并且只有它能拿到并应用。

这种注解混入的思想可以学习并用来为自己所用。

在SringSecurity中就通过注解混入来解决反序列化时安全配置问题。

image

反序列化时只允许满足三种条件的类型执行:SpringSecurity的白名单内、被混入、被JacksonAnnotation注解。

image

这是SpringSecurity提供的默认混入类型,其中还包括处理最新时间类型的JavaTimeModule。

image

image

在ObjectMapper执行注入的时候,生成了一个Module.SetupContext的匿名内部类,并把自己包裹了进入,这样所有注册的内容就跑到了ObjectMapper中,在后续处理时就可以取出并使用。

image

image

不只可以注入注解混入,还可以包含各种各样的其它序列化和反序列所需的内容。

image

对于Class、Constructor、Field、工厂Method及工厂Method的Parameter都可从被混入的类中获取到,当然是前提是名称或签名能对的上。其中工厂方法是静态的方法。并且只对静态的工厂方法混入注解,因为Jackson的反序列化只关注对象的实例化,所以只有构造器和工厂就够了,至于对象行为的其它普通方法不是Jackson需要关注的。

image

image

在查询是否已收集时,是通过构建一个MemberKey对象来确定的。它可以传入方法或构造器对象。

image

image

image

image

合并原始类注解和混入类注解时用了一个方法addOrOverride(),从而保证了混入类的注解优先级更高。

然后通过查找构造器是否存在注解JsonCreator而确定默认构造器,从而完成实例化。

image

image

原文地址:https://www.cnblogs.com/StarkBrothers/p/13991737.html