У меня есть веб-приложение Spring, которое получает объекты, которые должны быть внедрены как бины. Есть ли простой способ поручить Джексону создавать экземпляры как 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);
}
}
Контроллер My 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());
}
}
При десериализации Джексон в настоящее время пытается создать экземпляр объекта без Spring. Поэтому автопроводка instanceA
в классе B
равна нулю, и когда Джексон пытается установить значение в классе 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\"])
Но я хочуДжексону достать боб класса B
из Spring и вставить в него полученные данные. Есть ли какие-либо настройки десериализации или аннотации для достижения этого?