在 Jackson StdDeserializer 的自定义实例中自动装配 Bean
Autowiring Beans in Custom instance of Jackson StdDeserializer
我有一个请求对象,为对象的成员使用自定义反序列化器
@JsonDeserialize(using = SomeClassDeserializer.class)
private SomeClass someClass;
Spring Boot 默认情况下不会自动装配带注释的字段,即使 class 被注释为 @Component
因为 Jackson 处理实例化。我如何解决保留 Jackson 所需的默认构造函数,并注入要在反序列化器中使用的 bean?
我发现答案在于使用常规 @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;
}
我有一个请求对象,为对象的成员使用自定义反序列化器
@JsonDeserialize(using = SomeClassDeserializer.class)
private SomeClass someClass;
Spring Boot 默认情况下不会自动装配带注释的字段,即使 class 被注释为 @Component
因为 Jackson 处理实例化。我如何解决保留 Jackson 所需的默认构造函数,并注入要在反序列化器中使用的 bean?
我发现答案在于使用常规 @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;
}