【问题标题】:Custom Jackson deserializer doesn't inject into @Autowired fields自定义 Jackson 反序列化器不会注入 @Autowired 字段
【发布时间】:2021-06-17 18:35:36
【问题描述】:

我正在尝试将我的配置注入我的自定义 StdDeserializer。然而问题是,即使我将类标记为@Component,该字段的值也不会被注入。注入在应用程序的其他地方没有任何问题。

因此,我得出的结论是,问题出在反序列化器的工作方式上,因为它没有被我们实例化,而是像下面的示例:

ClassToDeserialize myClass = new ObjectMapper().readValue(mockJson, ClassToDeserialize.class);

如您所见,我的自定义反序列化器 ClassToDeserializeDeserializer 没有显式使用,因此它使用带有 @JsonDeserialize(using = ClassToDeserialize.class) 注释的自定义反序列化器检测类。

应该反序列化的类

@Data
@AllArgsConstructor
@SuperBuilder
@JsonDeserialize(using = MyClassDeserializer.class)
public class MyClass{
  private final String field1;
  private final String field2;
}

应该注入的配置类

@Configuration
@ConfigurationProperties(prefix = "myconfig")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyConfig {
   private final String confField1;
   private final String confField2;
}

MyClass 的自定义反序列化器:

@Component
public class MyClassDeserializer extends StdDeserializer<MyClass> {

    @Autowired
    MyConfig myConfig;

    public MyClassDeserializer () {
        this(null);
    }

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

    @Override
    public MyClassDeserializer deserialize(JsonParser parser, DeserializationContext context)
            throws IOException, JsonProcessingException {

         //Deserializing code that basically tries to read from myConfig
         myConfig.getConfField1(); //Hello NullPointerException my old friend
    }

}

反序列化器的使用

MyClass myClass = new ObjectMapper().readValue(mockJson, MyClass.class);

【问题讨论】:

    标签: java json spring spring-boot jackson


    【解决方案1】:

    不起作用的原因:

    Jackson 对 Spring Boot 的东西一无所知,所以当您 readValue(..) Jackson 看到带有反序列化器类的 @JsonDeserialize 注释并创建反序列化器的新实例时(它不会拾取 bean,而只是 @ 987654324@),这就是为什么你永远不会看到MyConfig 被注入。

    如果你想让它工作,你需要通过Spring Boot以某种方式注册这个反序列化器,例如:How to provide a custom deserializer with Jackson and Spring Boot

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2020-04-30
      • 2018-03-06
      • 1970-01-01
      • 2016-02-13
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      相关资源
      最近更新 更多