自定义 Jackson 反序列化器不会注入 @Autowired 字段
Custom Jackson deserializer doesn't inject into @Autowired fields
我正在尝试将我的配置注入我的自定义 StdDeserializer
。然而问题是,即使我将 class 标记为 @Component
,该字段的值也永远不会被注入。注入在应用程序的其他地方没有任何问题。
因此,我得出的结论是问题出在反序列化器的工作方式上,因为它没有被我们实例化,而是像下面的例子:
ClassToDeserialize myClass = new ObjectMapper().readValue(mockJson, ClassToDeserialize.class);
如您所见,我的自定义反序列化器 ClassToDeserializeDeserializer
没有明确使用,因此它使用带有 @JsonDeserialize(using = ClassToDeserialize.class)
注释的自定义反序列化器检测 classes。
Class 应该被反序列化
@Data
@AllArgsConstructor
@SuperBuilder
@JsonDeserialize(using = MyClassDeserializer.class)
public class MyClass{
private final String field1;
private final String field2;
}
应该注入的配置class
@Configuration
@ConfigurationProperties(prefix = "myconfig")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyConfig {
private final String confField1;
private final String confField2;
}
我的Class的自定义反序列化器:
@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);
不起作用的原因:
Jackson 对 Spring 引导程序一无所知,因此当您 readValue(..)
Jackson 看到带有反序列化器 @JsonDeserialize
的注释时 class 并创建反序列化器的新实例(它不拾取 bean,而只是 new MyClassDeserializer(..)
),这就是为什么你永远不会看到 MyConfig
被注入的原因。
如果你想让它工作,你需要通过Spring引导以某种方式注册这个解串器,例如,像这样:
我正在尝试将我的配置注入我的自定义 StdDeserializer
。然而问题是,即使我将 class 标记为 @Component
,该字段的值也永远不会被注入。注入在应用程序的其他地方没有任何问题。
因此,我得出的结论是问题出在反序列化器的工作方式上,因为它没有被我们实例化,而是像下面的例子:
ClassToDeserialize myClass = new ObjectMapper().readValue(mockJson, ClassToDeserialize.class);
如您所见,我的自定义反序列化器 ClassToDeserializeDeserializer
没有明确使用,因此它使用带有 @JsonDeserialize(using = ClassToDeserialize.class)
注释的自定义反序列化器检测 classes。
Class 应该被反序列化
@Data
@AllArgsConstructor
@SuperBuilder
@JsonDeserialize(using = MyClassDeserializer.class)
public class MyClass{
private final String field1;
private final String field2;
}
应该注入的配置class
@Configuration
@ConfigurationProperties(prefix = "myconfig")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyConfig {
private final String confField1;
private final String confField2;
}
我的Class的自定义反序列化器:
@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);
不起作用的原因:
Jackson 对 Spring 引导程序一无所知,因此当您 readValue(..)
Jackson 看到带有反序列化器 @JsonDeserialize
的注释时 class 并创建反序列化器的新实例(它不拾取 bean,而只是 new MyClassDeserializer(..)
),这就是为什么你永远不会看到 MyConfig
被注入的原因。
如果你想让它工作,你需要通过Spring引导以某种方式注册这个解串器,例如,像这样: