Чтение объекта JSON из @RequestHeader - PullRequest
1 голос
/ 30 октября 2019

Я получаю объект JSON, который передается мне как String из внешнего интерфейса, и я хочу, чтобы spring-boot проанализировал его для Map для меня.

Я пробовал @RequestHeader ("header-name ") Заголовок карты и @RequestHeader Map header, но оба дают мне карту всех заголовков вместо того, который я являюсь целью, который содержит JSON.

public ResponseEntity<MyObject> getStuff(@RequestHeader("My-Header") Map myHeaderJSON)

Я ожидаю переменную строку myHeaderJSONбыть разобранным в карту к весне. Есть ли способ добиться этого? Чтобы Spring-boot проанализировал строку в JSON или Map для меня?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Нет, вам нужно де-сериализовать его самостоятельно.

Из документов spring :

Если параметр метода равен Map<String, String>,MultiValueMap<String, String> или HttpHeaders, тогда карта заполняется всеми именами и значениями заголовков.

Она не будет извлекать и десериализовать JSON из карты, вместо этого вам нужно будет сделать что-то вроде:

public ResponseEntity<MyObject> getStuff(@RequestHeader Map myHeader) { 
    String json = myHeader.get("My-Header");
    MyClass myClass = objectMapper.readValue(json, MyClass.class);

    ... 
}

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

, если вы хотите, чтобы Spring вводил заголовок запроса http в метод контроллера (в качестве аргумента), попробуйте это следующим образом:

@RequestMapping("/your-path")
public ResponseEntity<MyObject> getStuff(@RequestHeader("My-Header") String jsonValue) {
   //...
}

также см. Здесь: https://www.viralpatel.net/spring-requestheader-example/

Вы также можете попытаться реализовать пользовательский конвертер, см. Здесь пример:

https://stackoverflow.com/a/50996349/150623

можно было бы использовать экземпляр ObjectMapper изБиблиотека Джексона для преобразования строки JSON в java.util.Map объект ...

может работать следующим образом (не проверено):

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class JsonToMapConverter implements Converter<String, Map<String,String>> {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Map<String, String> convert(final String json) {
        try {
           return objectMapper.readValue(json, Map.class);
        } catch (IOException e) {
           //handle exception...
        }
    }
}

не забудьте добавить Джексона в вашзависимости, например, в Maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...