无法将数组传递给 Spring 启动 Java
Unable to pass Array to Spring boot Java
我正在尝试向 Sprin boot 发送一个 POST 请求,其中包含正文中的自定义对象列表。我在请求正文中的 JSON 是这样的:
[{"name":"name1","icon":"icon1"},
{"name":"name2","icon":"icon2"},
{"name":"name3","icon":"icon3"}]
我收到这个错误
Cannot construct instance of `io.wedaily.topics.models.Topic` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
我的控制器:
@PostMapping
public void createTopics(@RequestBody List<Topic> topics) {
System.out.println(topics);
}
我的主题模型:
public class Topic {
private Long id;
private String name;
private String icon;
private Date createdAt;
// Constructor
// Getters
// Setters
}
异常非常明确,可以准确告诉您发生了什么。 Jackson 需要一个默认的、无参数的构造函数,为每个要反序列化的字段定义 getter 和 setter,或者,您需要一个带有 Jackson 注释的构造函数,告诉它如何将 json 映射到您的构造函数中。
只需修改您的主题 class 以包含如下所示的默认构造函数。 (如果你使用 lombok 用 @Data
注释你的 class 也可以做到这一点)
public class Topic {
private Long id;
private String name;
private String icon;
private Date createdAt;
public Topic(){
}
// Other all args constructor
// Getters
// Setters
}
您的应用程序需要一个模型 class 到 Jackson 可以将您的 post 数据映射到某种对象,然后您可以创建该对象的列表。
就像你发送的一样 post 是
[{"name":"name1","icon":"icon1"},
{"name":"name2","icon":"icon2"},
{"name":"name3","icon":"icon3"}]
所以你的模型 class 会像
public class mapModel {
private String name;
private String icon;
public String getName(){return this.name;}
public void setName(String name){this.name = name;}
public String getIcon(){return this.icon;}
public void setIcon(String icon){this.icon = icon;}
}
你的post映射控制器看起来像这样
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import com.doc.autobuild.autobuild.model.mapModel;
@RestController
public class postMappingExample{
@PostMapping("/reqPost")
public ResponseEntity<HttpStatus> postController(@RequestBody List<mapModel> bodyParamList){
for(mapModel mm : bodyParamList){System.out.println(mm.getName());}
return ResponseEntity.ok(HttpStatus.OK);
}
}
我正在尝试向 Sprin boot 发送一个 POST 请求,其中包含正文中的自定义对象列表。我在请求正文中的 JSON 是这样的:
[{"name":"name1","icon":"icon1"},
{"name":"name2","icon":"icon2"},
{"name":"name3","icon":"icon3"}]
我收到这个错误
Cannot construct instance of `io.wedaily.topics.models.Topic` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
我的控制器:
@PostMapping
public void createTopics(@RequestBody List<Topic> topics) {
System.out.println(topics);
}
我的主题模型:
public class Topic {
private Long id;
private String name;
private String icon;
private Date createdAt;
// Constructor
// Getters
// Setters
}
异常非常明确,可以准确告诉您发生了什么。 Jackson 需要一个默认的、无参数的构造函数,为每个要反序列化的字段定义 getter 和 setter,或者,您需要一个带有 Jackson 注释的构造函数,告诉它如何将 json 映射到您的构造函数中。
只需修改您的主题 class 以包含如下所示的默认构造函数。 (如果你使用 lombok 用 @Data
注释你的 class 也可以做到这一点)
public class Topic {
private Long id;
private String name;
private String icon;
private Date createdAt;
public Topic(){
}
// Other all args constructor
// Getters
// Setters
}
您的应用程序需要一个模型 class 到 Jackson 可以将您的 post 数据映射到某种对象,然后您可以创建该对象的列表。
就像你发送的一样 post 是
[{"name":"name1","icon":"icon1"},
{"name":"name2","icon":"icon2"},
{"name":"name3","icon":"icon3"}]
所以你的模型 class 会像
public class mapModel {
private String name;
private String icon;
public String getName(){return this.name;}
public void setName(String name){this.name = name;}
public String getIcon(){return this.icon;}
public void setIcon(String icon){this.icon = icon;}
}
你的post映射控制器看起来像这样
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import com.doc.autobuild.autobuild.model.mapModel;
@RestController
public class postMappingExample{
@PostMapping("/reqPost")
public ResponseEntity<HttpStatus> postController(@RequestBody List<mapModel> bodyParamList){
for(mapModel mm : bodyParamList){System.out.println(mm.getName());}
return ResponseEntity.ok(HttpStatus.OK);
}
}