无法将响应反序列化为 RestTemplate 中的 class

Cannot deserialize response into a class in RestTemplate

我正在尝试获取对象的 ArrayList 并在包装器中对其进行初始化 class,

这是我的要求;

 RestTemplate restTemplate = new RestTemplate();
 Inventory i = restTemplate.getForObject("http://localhost:8082/items",Inventory.class);

我的响应处理程序;

@RequestMapping(value ="/items", method = RequestMethod.GET) 
 public ArrayList<Item> getItems() {
 return ItemList.getItemList();
 }

我的物品列表class,

public class ItemList{
//to keep a list of globally available list of orders with the type Item.class objects
private static ArrayList<Item> itemList;

public static ArrayList<Item> getItemList() {
    return itemList;
}

public static void setItemList(ArrayList<Item> itemList) {
    ItemList.itemList = itemList;
}

public static Item getItemById(String id) throws NoSuchItem {
    ArrayList<Item> temp = ItemList.getItemList();
    for(Item x:temp){
         if(x.getId().equals(id))
          return x;
     }
     throw new NoSuchItem();
}
};

我的库存class,

public class Inventory{

private ArrayList<Item> itemList;

public ArrayList<Item> getRandomList(int size) {
    ArrayList<Item> items = new ArrayList<Item>();
    ArrayList<Item> temp = this.itemList;
    if(size>=itemList.size()){
        return itemList;
    }
    else{
      Random rand = new Random();      
      for(int i=0;i<size;i++){
        int j = rand.nextInt(temp.size());
        Item random = temp.get(j);
        random.generateQuantity();
        items.add(random);
        temp.remove(random);
      }
    }
    return items;

}

public ArrayList<Item> getItemList() {
    return itemList;
}

public void setItemList(ArrayList<Item> itemList) {
    this.itemList = itemList;
}


};

最后是我的项目 class,

public class Item {
private String  name ;
private String  supplier ;
private String   weight;
private String   id ;
private String   location = "not assigned" ;
private int quantity;

public String getName() {
    return name;
}

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

public String getSupplier() {
    return supplier;
}

public void setSupplier(String supplier) {
    this.supplier = supplier;
}

public String getWeight() {
    return weight;
}

public void setWeight(String weight) {
    this.weight = weight;
}

public String getId() {
    return id;
}

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

public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}

public int getQuantity() {
    return quantity;
}

public void generateQuantity(){
    Random rand = new Random();
    int i = rand.nextInt(100);
    if(i<3){
        this.quantity = 3;
    }
    else if(i<33){
        this.quantity = 2;    
    }
    else{
        this.quantity = 1;
    }
    }
    };

我正在使用 springboot 构建一个微服务项目,我的响应和 ItemList class 存在于一个服务中,请求和 Inventory 存在于下一个服务中, Item class 存在于两个服务中,但是当我 运行 该方法时,我得到一个 JSON 解析错误:无法从 START_ARRAY 令牌中反序列化 ServiceA.Inventory 的实例,我在这里做错了什么?

PS - /items 端点的示例响应 returns ,

[
{
    "name": "Mars",
    "supplier": "Nestle",
    "weight": "1",
    "id": "mars",
    "location": "not asssigned"
},
{
    "name": "Kit Kat",
    "supplier": "Nestle",
    "weight": "1",
    "id": "kitkat",
    "location": "not asssigned"
},
{
    "name": "Double Decker",
    "supplier": "Nestle",
    "weight": "1",
    "id": "dd",
    "location": "not asssigned"
}
]

我认为您需要向项目添加一个无参数构造函数 class。

根据您的说法 JSON 回复中没有 Inventory。所以当你这样做时:

Inventory i = restTemplate.getForObject("http://localhost:8082/items", Inventory.class);

它抱怨是因为您的响应实际上有一个 Item 的数组(或列表)。无法从数组中实例化对象清单。试试这个:

Item[] items = restTemplate.getForObject("http://localhost:8082/items", Item[].class);

它应该可以工作。

要 class Inventory 反序列化您的 JSON 响应应该类似于:

{
    itemList: [
        {
            "name": "Mars",
            "supplier": "Nestle",
            "weight": "1",
            "id": "mars",
            "location": "not asssigned"
        },
    ...
    ]
}

但注意:你的ItemList也有问题。无论如何,这是另一个话题,因为你应该首先考虑你的反应 JSON 是否可以。