Как внедрить бины, когда Джексон десериализует JSON-запрос? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть веб-приложение 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 и вставить в него полученные данные. Есть ли какие-либо настройки десериализации или аннотации для достижения этого?

1 Ответ

0 голосов
/ 04 октября 2019

Я хочу, чтобы Джексон получил бин класса B. из Spring и вставил в него полученные данные.

Нет аннотации, которая бы это делала. Технически это возможно, но требует определенных усилий. Вы можете реализовать свой собственный десериализатор и зарегистрировать его через ObjectMapper. В этом десериализаторе вместо создания нового экземпляра bean-компонента вы будете искать bean-компонент Spring, а затем «вручную» устанавливать каждый из его атрибутов.

Я бы не рекомендовал вам десериализовать в Spring-бины. Я бы посоветовал вам определить какой-нибудь обычный Java-компонент (не Spring-компонент) и использовать его для сериализации / десериализации. Вы можете использовать его как свои бобы Spring A и B, чтобы сохранить состояние. Это может быть проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...