找不到接口 java.util.List Rest API Spring boot 的主要或默认构造函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/54663351/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
No primary or default constructor found for interface java.util.List Rest API Spring boot
提问by Hermione Granger
I am passing a request body to a POST request on postman similar to this:
我将请求正文传递给邮递员的 POST 请求,类似于:
"name":"Mars",
"artifacts":[
{
"elements":[
{
"name":"carbon",
"amount":0.5,
"measurement":"g"
}
],
"typeName":"typeA"
},
{
"elements":[
{
"name":"hydrogen",
"amount":0.2,
"measurement":"g"
}
],
"typeName":"typeB"
}
]
The create method in the rest controller looks like this.
其余控制器中的 create 方法如下所示。
@RequestMapping("/create")
public Planet create(@RequestBody Planet data) {
Planet mars = planetService.create(data.getName(),data.getArtifacts());
return mars;
Planet and all its nested objects have a default constructor such as:
Planet 及其所有嵌套对象都有一个默认构造函数,例如:
public Planet() {}
However, I am not able to create a new planet object because of lack of a default constructor. Please help!
但是,由于缺少默认构造函数,我无法创建新的行星对象。请帮忙!
EDIT: Planet 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
}
Artifact 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;
}
}
Element 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
}
}
采纳答案by Arpit Agrawal
I don't understand what is the issue you are facing, but i can see an error straight away so guessing that is the issue you are facing, i am going to give you a solution.
我不明白您面临的问题是什么,但我可以立即看到错误,因此猜测这就是您面临的问题,我将为您提供解决方案。
Create a class which matches your json data structure like this :
创建一个与您的 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.
}
Then your controller should look like this. Basically you needed to put @RequestBody
to all the parameters you want to recieve from request JSON. Earlier you only put @RequestBody
to name parameter not artifact parameter and since Request Body can be consumed only once, so you need a wrapper class to recieve the complete request body using single @RequestBody
annotation.
那么你的控制器应该是这样的。基本上,您需要将@RequestBody
要从请求 JSON 接收的所有参数放入。之前您只@RequestBody
输入 name 参数而不是 artifact 参数,并且由于 Request Body 只能使用一次,因此您需要一个包装类来使用单个@RequestBody
注释接收完整的请求正文。
@RequestMapping("/create")
public String create(@RequestBody PlanetData data) {
Planet mars = planetService.create(data.getName(),data.getArtifacts());
return mars.toString();
}
Edit : Looking at the Planet class, it also needs some modification
编辑:查看 Planet 类,它还需要一些修改
public class Planet {
private String typeName; // key in json should match variable name for proper deserialization or you need to use some Hymanson 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.
}
Hope this solves your issue.
希望这能解决您的问题。
回答by YXSpace
you should write as below:
你应该写如下:
...
public String create(@RequestBody JSONObject requestParams) {
String name=requestParams.getString("name");
List<Planet> planetArtifacts=requestParams.getJSONArray("artifacts").toJavaList(Planet.Class);
...
回答by iPirat
I guess, it's trying to call new List()
which has no constructor. Try using new ArrayList<>()
in your signatures.
我想,它正在尝试调用new List()
没有构造函数的对象。尝试new ArrayList<>()
在您的签名中使用。
If it works this way, you have found the error. Then rethink your concept of calling methods, since you would usually want to avoid using implementations of List in method signatures
如果它以这种方式工作,则您已发现错误。然后重新考虑调用方法的概念,因为您通常希望避免在方法签名中使用 List 的实现
回答by Marc
I had that error when I forgot the @RequestBody
before the parameter
当我忘记@RequestBody
之前的参数时,我遇到了那个错误
@RequestMapping("/create")
public Planet create(@RequestBody Planet data) {