无法将响应反序列化为 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 是否可以。
我正在尝试获取对象的 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 是否可以。