SpringCloud RestTemplate获取空对象体(解析Json空)?

SpringCloud RestTemplate获取空对象体(解析Json空)?,spring,spring-boot,resttemplate,Spring,Spring Boot,Resttemplate,虽然我将RestTemplate与字符串ResponseType一起使用,但它运行正常 ResponseEntity<String> response = restTemplate.postForEntity(uri, request, String.class); 当我使用JavaPOJO保存响应时,Java对象的属性都是空的 ResponseEntity<queryTinyListResponse> responseEntity = restTemplate.pos

虽然我将RestTemplate与字符串ResponseType一起使用,但它运行正常

ResponseEntity<String> response = restTemplate.postForEntity(uri,
request, String.class);
当我使用JavaPOJO保存响应时,Java对象的属性都是空的

ResponseEntity<queryTinyListResponse> responseEntity = restTemplate.postForEntity(uri, request, queryTinyListResponse.class);
QueryTynyListResponse.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;
}
@JsonIgnoreProperties(ignoreUnknown=true)
公共类QueryTynyListResponse实现可序列化{
公共类数据{
私有字符串公司ID;
private List tinyIdList=new ArrayList();
私人串龋;
//getter setter getCompanyId()等。。
}
公共数据getData(){
返回数据;
}
//吸气剂设定器
私人数据;
私有整数码;
私有字符串msg;
}

您可以在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();
    }
}

我已经找到了这个问题的答案。我应该使用
static
内部类

找到了!!。这个解决办法其实很奇怪。问题来自内部类。旧建筑是这样的:

public class MetaData{
  ...
  public class Data {

     ....

     public class Item{
       ...
     }
   }
}
内部类必须是静态的,因为Jackson无法直接实例化内部类

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

     ....

   public static class Item{
       ...
     }
   }
}

一切都很顺利。希望有帮助

检查内容类型application/json的服务器响应头是否正确?
spring.jackson.default-property-inclusion=non_null
public class MetaData{
  ...
  public class Data {

     ....

     public class Item{
       ...
     }
   }
}
public class MetaData{
  ...
  public static class Data {

     ....

   public static class Item{
       ...
     }
   }
}