【发布时间】:2019-10-04 15:20:43
【问题描述】:
我有一个 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);
}
}
我的 Spring 控制器如下所示。
@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 为空,当Jackson 尝试设置B 类中的值时,它会给出以下响应消息(400):
JSON parse error: null; nested exception is com.fasterxml.jackson.databind.JsonMappingException: N/A\n at [Source: (PushbackInputStream); line: 2, column: 27] (through reference chain: B[\"value\"])
但我希望 Jackson 从 Spring 中获取一个类 B bean 并将接收到的数据粘贴到其中。是否有任何反序列化设置或注释来实现这一点?
【问题讨论】:
标签: spring spring-mvc jackson