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

问题描述 投票:0回答:2

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

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

Spring Boot 默认情况下不会自动装配带注释的字段,即使该类使用

@Component
进行注释,因为 Jackson 会处理实例化。如何保留 Jackson 所需的默认构造函数并注入 bean 以在反序列化器中使用?

java spring spring-boot jackson json-deserialization
2个回答
3
投票

我发现答案在于第三个构造函数,使用传统的

@Autowired
注释并以这种方式注入所需的 bean。但是,不要使用成员分配的典型实例,而是将该字段声明为静态并将此注入的 bean 分配给 Jackson 生成的反序列化器的所有实例。这是一种棘手的解决方法,但它为我解决了问题。

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;
    }

0
投票
public class SomeClassDeserializer extends StdDeserializer<SomeObject> {

    @Autowired
    private  SomeUtil someUtil;

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

    public SomeClassDeserializer() {
        this(null);
    }

  /*  @Autowired
    public SomeClassDeserializer(SomeUtil someUtil) {
        this(null);
        SomeClassDeserializer.someUtil= someUtil;
    }*/

I have a question as to why we cannot do this instead of the answer above
© www.soinside.com 2019 - 2024. All rights reserved.