Spring Cloud RestTemplate получить нулевое тело объекта (синтаксический анализ Json null)? - PullRequest
0 голосов
/ 29 июня 2018

пока я использую RestTemplate с String ResponseType, он работает нормально.

ResponseEntity<String> response = restTemplate.postForEntity(uri,
request, String.class);

Return Json String

{"code":0,"message":null,"data":"{\"companyId\":\"1\",\"tinyIdList\":[\"2\"],\"carId\":\"3\"}"}

Хотя я использую Java POJO для сохранения ответа, все атрибуты объекта Java имеют значение null

ResponseEntity<queryTinyListResponse> responseEntity = restTemplate.postForEntity(uri, request, queryTinyListResponse.class);

Результат:

body:queryTinyListResponse{data=Data{tinyIdList=[], carId='null', companyId='null'}, code=0, msg='null'}

queryTinyListResponse.class:

@JsonIgnoreProperties(ignoreUnknown = true)
public class queryTinyListResponse implements Serializable {
    public class Data{
        private String companyId;
        private List<String> tinyIdList=new ArrayList<String>();
        private String carId;
        //getter setter getCompanyId() etc..

    }
    public Data getData() {
        return data;
    }

    //getter setter
    private  Data data;
    private int code;
    private String msg;
}

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Я нашел ответ на этот вопрос. Я должен использовать static внутренний класс здесь

Нашёл !! Решение довольно странное на самом деле. Проблема исходит от внутренних классов. Старая структура была такой:

public class MetaData{
  ...
  public class Data {

     ....

     public class Item{
       ...
     }
   }
}

Внутренние классы должны быть static, потому что Джексон не может напрямую создать экземпляр внутреннего класса.

public class MetaData{
  ...
  public static class Data {

     ....

   public static class Item{
       ...
     }
   }
}

Все работало просто отлично. Надеюсь, что это помогло!

0 голосов
/ 29 июня 2018

вы можете использовать в вашем application.properties/yml эту конфигурацию: spring.jackson.default-property-inclusion=non_null, а затем я попытался воспроизвести подобную конфигурацию, и я нашел в вашей строке ответа

{"code":0,"message":null,"data":"{\"companyId\":\"1\",\"tinyIdList\":[\"2\"],\"carId\":\"3\"}"}

синтаксическая ошибка jeson должна быть {\"code\":0,\"message\":null,\"data\":{\"companyId\":\"1\",\"tinyIdList\":[\"2\"],\"carId\":\"3\"}} в противном случае поле данных рассматривается как строка, а не объект данных.

если вы хотите попробовать себя, вы можете попробовать этот код:

package com.example.jacksondemo;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.RequestEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class JacksonDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(JacksonDemoApplication.class, args);
    }
}

@lombok.Data
@JsonIgnoreProperties(ignoreUnknown = true)
class QueryTinyListResponse implements Serializable {

    //getter setter
    private  Data data;
    private int code;
    private String msg;
}

@lombok.Data
class Data implements Serializable {
    private String companyId;
    private List<String> tinyIdList=new ArrayList<String>();
    private String carId;
    //getter setter getCompanyId() etc..

}

@RestController
class QueryTinyListResponseController {

    @PostMapping
    public String query(){
        return "{\"code\":0,\"message\":null,\"data\":{\"companyId\":\"1\",\"tinyIdList\":[\"2\"],\"carId\":\"3\"}}";

    }
}


@RestController
class QueryTinyListResponseControllerClient {

    @GetMapping("/client")
    public QueryTinyListResponse query(){
        RestTemplate restTemplate = new RestTemplate();

        return restTemplate.postForEntity("http://localhost:8080/", RequestEntity.EMPTY, QueryTinyListResponse.class).getBody();
    }
}

application.properties

spring.jackson.default-property-inclusion=non_null
...