繁体   English   中英

没有为接口 java.util.List 找到主构造函数或默认构造函数

[英]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

不兼容的类型。 必需的 java.util.List<object> 找到 java.util.List<integer><div id="text_translate"><p> 我需要在 Android Studio 中为 Android 项目使用列表列表,但任何时候尝试声明一个我都会突出显示此错误。 我尝试制作演员表,我尝试使用 generics 和几乎所有东西,但每次我都会突出显示此错误。 以下是发送此错误的一种代码示例:</p><pre> List&lt;List&lt;Object&gt;&gt; p = Arrays.asList( Arrays.asList(1,2,3) );</pre><p> 最奇怪的是,在 IntelliJ 中,这段代码运行得非常好。 所以,我想知道如何解决这个问题。</p></div></integer></object>

[英]Incompatible types. Required java.util.List<Object> found java.util.List<Integer>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 提交表单时没有找到接口 java.util.List 的主要或默认构造函数? 无效的@BsonCreator 构造函数。 预期 class java.lang.String,找到接口 java.util.List spring boot - 如何在HTTP控制器处理程序中避免“无法实例化[java.util.List]:指定的类是一个接口”? 不兼容的类型; 找到:接口java.util.List <java.lang.Object> ,必需:接口java.util.List <test.entity.Emp> 找不到AttributedString(java.util.List <java.lang.String> ) Spring-data-mongo 无法使用构造函数实例化 java.util.List spring MVC3错误无法实例化bean类[java.util.List]:指定的类是偶尔的接口 Spring Mongodb-无法实例化 bean class [java.util.List]:指定 class 是一个接口 不兼容的类型。 必需的 java.util.List<object> 找到 java.util.List<integer><div id="text_translate"><p> 我需要在 Android Studio 中为 Android 项目使用列表列表,但任何时候尝试声明一个我都会突出显示此错误。 我尝试制作演员表,我尝试使用 generics 和几乎所有东西,但每次我都会突出显示此错误。 以下是发送此错误的一种代码示例:</p><pre> List&lt;List&lt;Object&gt;&gt; p = Arrays.asList( Arrays.asList(1,2,3) );</pre><p> 最奇怪的是,在 IntelliJ 中,这段代码运行得非常好。 所以,我想知道如何解决这个问题。</p></div></integer></object> 无法解析构造函数&#39;ArrayList(java.util.List <T> )`在Java中
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM