我有一个Spring Web应用程序,该应用程序接收需要作为Bean注入的对象。有没有一种简单的方法可以指示Jackson在反序列化时将实例创建为Spring bean,而无需实现自定义反序列化器?
我的代码如下:
我有一个A
类,其中某些属性是自动连接的,而有些则不是。
@Component
public class A {
private String value;
@Autowired
private Obj autowiredObj;
// getter & setter
}
另一个类B
具有几个与类A
类似的自动装配对象。当通过杰克逊发送类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的对象。因此,类instanceA
中的自动连接B
为空,并且当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,并将接收到的数据粘贴到其中。是否有任何反序列化设置或注释可实现这一目标?
答案 0 :(得分:0)
我希望Jackson从Spring获得B类bean并将其粘贴 接收到的数据。
没有注释可以做到这一点。从技术上讲是可能的,但是需要一些努力。您可以实现自己的解串器并通过ObjectMapper注册。在此反序列化器中,您无需查找bean的新实例,而是查找Spring bean,然后“手动”设置其每个属性。
我不鼓励您反序列化为Spring bean。我建议您定义一些普通的Java bean(而不是Spring bean)并将其用于序列化/反序列化。您可以在Spring bean A和B中使用它来保持状态。这样会更容易。