当杰克逊反序列化 JSON 请求时如何注入 bean?



我有一个Spring Web应用程序,它接收需要注入为bean的对象。有没有一种简单的方法可以指示 Jackson 在反序列化时将实例创建为 Spring Bean,而无需实现自定义反序列化程序?

我的代码如下所示:

我有一个类A其中有些属性是自动连线的,有些不是。

@Component
public class A {
private String value;
@Autowired
private Obj autowiredObj;
// getter & setter
}

另一个类B有几个类似于类A的自动连线对象。当通过 Jackson 发送类B对象时,我只想发送类A像对象一样的一些值,而不是类A对象本身。

@Component
public class B {
@Autowired
@JsonIgnore
private A instanceA;
public String getValue() {
return instanceA.getValue();
}
public void setValue(String value) {
instanceA.setValue(value);
}
}

我的弹簧控制器看起来像这样。

@Controller
public class AppController {
@RequestMapping(value = "/receive",
consumes = { "application/json" },
method = RequestMethod.POST)
public void receiveB(@RequestBody B instanceB) {
System.out.println("Value: " + instanceB.getValue());
}
}

在反序列化时,Jackson 目前正在尝试在没有 Spring 的情况下实例化一个对象。因此,类B中的自动连线instanceA为 null,当 Jackson 尝试在类B中设置值时,它会给出以下响应消息 (400(:

JSON parse error: null; nested exception is com.fasterxml.jackson.databind.JsonMappingException: N/An at [Source: (PushbackInputStream); line: 2, column: 27] (through reference chain: B["value"])

但我希望杰克逊从 Spring 获取一个B豆类,并将接收到的数据粘贴到其中。是否有任何反序列化设置或注释来实现这一点?

我希望杰克逊从春天得到一个B类豆子并粘贴 接收到其中的数据。

没有注释可以做到这一点。从技术上讲,这是可能的,但需要一些努力。您可以实现自己的反序列化程序并通过 ObjectMapper 注册它。在此反序列化器中,您将查找 Spring Bean,然后"手动"设置其每个属性,而不是创建 Bean 的新实例。

我不鼓励你反序列化为春豆。我建议你定义一些普通的Javabean(不是Spring bean(并将其用于序列化/反序列化。你可以同时使用它来保持你的春豆 A 和 B 来保持状态。这可能更容易。

最新更新