![](/img/trans.png)
[英]Receive No primary or default constructor found for interface java.util.List when submitting form?
[英]No primary or default constructor found for interface java.util.List Rest API Spring boot
我将请求正文传递给 postman 上的 POST 请求,类似于:
"name":"Mars",
"artifacts":[
{
"elements":[
{
"name":"carbon",
"amount":0.5,
"measurement":"g"
}
],
"typeName":"typeA"
},
{
"elements":[
{
"name":"hydrogen",
"amount":0.2,
"measurement":"g"
}
],
"typeName":"typeB"
}
]
rest controller中的create方法是这样的。
@RequestMapping("/create")
public Planet create(@RequestBody Planet data) {
Planet mars = planetService.create(data.getName(),data.getArtifacts());
return mars;
Planet 及其所有嵌套对象都有一个默认构造函数,例如:
public Planet() {}
但是,由于缺少默认构造函数,我无法创建一个新星球 object。 请帮忙!
编辑:行星 class
public class Planet {
@JsonProperty("name")
private String name;
@Field("artifacts")
private List<Artifact> artifacts;
public Planet() {}
public Planet(String name, List<Artifact> artifacts)
{
this.name = name;
this.artifacts = artifacts;
}
//setters and getters
}
神器class:
public class Artifact() {
@Field("elements")
private List<Element> elements;
@JsonProperty("typeName")
private String typeName;
public Artifact() {}
public Artifact(String typeName, List<Element> elements)
{
this.typeName = typeName;
this.elements = elements;
}
}
元件 class:
public class Element() {
@JsonProperty("elementName")
private String name;
@JsonProperty("amount")
private double amount;
@JsonProperty("measurement")
private String measurement;
public Element() {}
public Element(String name, double amount, String measurement)
{
//assignments
}
}
当我忘记参数之前的@RequestBody
时,我遇到了同样的错误
@RequestMapping("/create")
public Planet create(@RequestBody Planet data) {
我不明白您面临的问题是什么,但我可以立即看到一个错误,因此猜测这是您面临的问题,我将为您提供解决方案。
创建一个与您的 json 数据结构匹配的类,如下所示:
Class PlanetData {
private String name;
private List<Planet> artifacts;
public PlanetData(String name, List<Planet> artifacts){
name = name;
artifacts = artifacts;
}
// include rest of getters and setters here.
}
然后你的控制器应该是这样的。 基本上,您需要将@RequestBody
放入您希望从请求 JSON 中接收的所有参数中。 之前您只将@RequestBody
放入名称参数而不是工件参数,并且由于请求正文只能使用一次,因此您需要一个包装类来使用单个@RequestBody
注释接收完整的请求正文。
@RequestMapping("/create")
public String create(@RequestBody PlanetData data) {
Planet mars = planetService.create(data.getName(),data.getArtifacts());
return mars.toString();
}
编辑:查看 Planet 类,它还需要一些修改
public class Planet {
private String typeName; // key in json should match variable name for proper deserialization or you need to use some jackson annotation to map your json key to your variable name.
private List<Element> elements;
public Planet() {}
public Planet(String typeName, List<Element> elements)
{
this.typeName = typeName;
this.elements = elements;
}
//setters and getters. Remember to change your setters and getter from name to typeName.
}
希望这可以解决您的问题。
我想,它试图调用没有构造函数的new List()
。 尝试在您的签名中使用ArrayList
。
如果它以这种方式工作,那么您已经发现了错误。 然后重新考虑调用方法的概念,因为您通常希望避免在方法签名中使用 List 的实现
你应该写如下:
...
public String create(@RequestBody JSONObject requestParams) {
String name=requestParams.getString("name");
List<Planet> planetArtifacts=requestParams.getJSONArray("artifacts").toJavaList(Planet.Class);
...
确保您的请求类型不是 GET 类型,如果是这样,最好不要将数据作为请求正文发送。
这个答案也可能对某人有所帮助。
当您使用 spring 框架进行 API 开发时,您可能会意外地为 RequestBody 和 RequestHeader 注释导入错误的库。
就我而言,我不小心导入了库,
io.swagger.v3.oas.annotations.parameters.RequestBody
这可能会出现上述问题。
请确保您使用的是正确的库
org.springframework.web.bind.annotation.RequestBody
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.