在 Jackson StdDeserializer 的自定义实例中自动装配 Bean

Posted

技术标签:

【中文标题】在 Jackson StdDeserializer 的自定义实例中自动装配 Bean【英文标题】:Autowiring Beans in Custom instance of Jackson StdDeserializer 【发布时间】:2018-07-31 02:22:19 【问题描述】:

我有一个使用自定义反序列化器的请求对象,用于对象成员

@JsonDeserialize(using = SomeClassDeserializer.class)
private SomeClass someClass;

默认情况下,Spring Boot 不会自动装配带注释的字段,即使该类使用 @Component 注释,因为 Jackson 处理实例化。如何解决保留 Jackson 所需的默认构造函数并注入 bean 以在 Deserializer 中使用?

【问题讨论】:

【参考方案1】:

我发现答案在于第三个构造函数,它使用传统的@Autowired 注释并以这种方式注入所需的 bean。但是,不是使用典型的成员分配实例,而是将该字段声明为静态并将这个注入的 bean 分配给 Jackson 生成的反序列化器的所有实例。这是一种 hacky 解决方法,但它为我解决了问题。

public class SomeClassDeserializer extends StdDeserializer<SomeObject> 
    private static SomeUtil someUtil;

    public SomeClassDeserializer(Class<?> vc) 
        super(vc);
    

    public SomeClassDeserializer() 
        this(null);
    

    @Autowired
    public SomeClassDeserializer(SomeUtil someUtil) 
        this(null);
        SomeClassDeserializer.someUtil= someUtil;
    

【讨论】:

andrewdleach,我遇到了你提到的同样的问题,你能提供你的代码来解决你上面实现的问题吗? @user2917559 查看修改后的答案

以上是关于在 Jackson StdDeserializer 的自定义实例中自动装配 Bean的主要内容,如果未能解决你的问题,请参考以下文章

jackson使用入门

jackson 解析json ,使用注解

jackson学习之二:jackson-core

如何在Github下载jackson的jar包

Jackson忽略空字段

jackson中文是啥意思