无法将数组传递给 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);
    }
}