SpringBoot Rest响应没有与杰克逊一起解决

时间:2017-03-30 13:33:54

标签: json rest spring-boot jackson

我正在使用SpringBoot运行一个项目。在这个项目中,我打电话给外部休息服务。我已将响应项建模为bean。 但是当我收到响应时,数据没有被序列化到bean中。 我想一定有一些配置缺失,但我找不到。

我已将onfiguration spring-boot-starter-test添加到Maven的配置中:

其他客户:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RestClientTest {

    @Autowired
    private RestTemplateBuilder restTemplate;

    @Test
    public void sayHello() {
        System.out.println("Hello");
        assert(true);
    }

    @Test
    public void testGetEmployee() {
        RestTemplate template = restTemplate.build();;
        HttpHeaders headers = new HttpHeaders();

        List<MediaType> types = new ArrayList<MediaType>();
        types.add(MediaType.APPLICATION_JSON);
        types.add(MediaType.APPLICATION_XML);
        headers.setAccept(types);
        headers.set("Authorization", "Bearer gWRdGO7sUhAXHXBnjlBCtTP");
        HttpEntity<Items> entity = new HttpEntity<Items>(headers);

        String uri = "https://mytest.com/employees";

        //ResponseEntity<String> rec = template.exchange(uri, HttpMethod.GET, entity, String.class);
        //System.out.println("Received: " + rec);


        ResponseEntity<Items> rec = template.exchange(uri, HttpMethod.GET, entity, Items.class);
        System.out.println("Received: " + rec);
    }
}

当我检查响应元素时,我得到一个列表,所有项都是空值

    @JsonFormat(shape = JsonFormat.Shape.OBJECT)
    public class Item implements Serializable {

    @JsonProperty
    private String id;
    @JsonProperty
    private String name;
    @JsonProperty
    private String email;
    @JsonProperty
    private String phone;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}


@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public class Items implements Serializable {

    @JsonProperty
    private List<Item> items = new ArrayList<Item>();

    public List<Item> getItems() {
        return items;
    }
}

你看到我在这里失踪了吗?

响应是这样的:

{
  "items": [
    {
      "item": {
        "id": 0,
        "name": "string",
        "email": "string",
        "phone": "string",

你看到我在这里失踪了吗?

由于

吉勒

2 个答案:

答案 0 :(得分:0)

您实现的方法将尝试将数据反序列化为Items类。但是它没有反序列化所需的属性。当需要通过其余模板交换获取数据列表时,可以按以下方式获取它们。

  1. 获取数据作为数组并将其转换为arrayList。

    Item[] itemArray = template.exchange(uri, HttpMethod.GET, entity, Item[].class).getBody();
    
    List<Item> itemList = Arrays,asList(itemArray);
    

  1. 使用ParameterizedTypeReference将数据作为列表获取

    ResponseEntity<List<Item>> itemList = template.exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<Item>>() {});
    
    List<Item> itemList = template.exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<Item>>() {}).getBody(); // access list directly
    

答案 1 :(得分:-1)

您可能需要将其添加到ObjectMapper中:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

在您的实体上添加@JsonRootName("item")