IllegalStateException: ожидаемая строка, но была BEGIN_OBJECT в строке 1, столбец 2, путь $; Вложенным исключением является com.google.gson.JsonSyntaxException - PullRequest
1 голос
/ 15 апреля 2019

Я делаю почтовый запрос в SpringBoot и тестирую его с почтальоном, но когда я передаю тело в Postman и пытаюсь прочитать его в моем приложении, он выдает ошибку.
Это метод в Spring:

@PostMapping(path=PathConstants.START_ACTION)
    public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) String params){

if(params!=null) {
                Gson gson = new Gson();
                Map<String,Object> pvar = gson.fromJson(params, Map.class);
                System.out.println(pvar);           
            } 
}

В Почтальоне я передаю параметры следующим образом:

enter image description here

Я указал в заголовке тип содержимого как application/json.
Но тогда, если я передаю свои параметры с помощью вкладки "Param"

enter image description here

, это работает.Но мне нужно передать их как тело, а не параметры.Где здесь проблема?

1 Ответ

1 голос
/ 15 апреля 2019

Метод 1:

Заголовок Content-Type равен application-json. Поэтому Spring попытается построить ваш json в LinkedHashMap.

Теперь попробуйте это ...

@PostMapping(path=PathConstants.START_ACTION)
    public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) Map<String, Object> bodyObject){

if(MapUtils.isNotEmpty(bodyObject)) {
              Map<String,Object> pvar = bodyObject;
}

вместо

@PostMapping(path=PathConstants.START_ACTION)
    public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) String params){

if(params!=null) {
                Gson gson = new Gson();
                Map<String,Object> pvar = gson.fromJson(params, Map.class);
                System.out.println(pvar);           
            } 
}

и передать header content-type как application/json. это будет работать ..

Метод 2 ::

Теперь, если вы все еще хотите использовать свой собственный старый метод подписи, как этот ..

 @PostMapping(path=PathConstants.START_ACTION)
        public String start(@PathVariable String processDefinitionId, @RequestBody(required=false) String params){}

затем header content-type как text/plain. тогда ваш старый метод будет работать также ..

...