为了账号安全,请及时绑定邮箱和手机立即绑定

未找到接口 java.util.List Rest API Spring boot 的主构造函数

未找到接口 java.util.List Rest API Spring boot 的主构造函数

繁华开满天机 2022-06-15 17:16:32
我正在将请求正文传递给邮递员的 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 控制器中的 create 方法如下所示。  @RequestMapping("/create")  public Planet create(@RequestBody Planet data) {      Planet mars = planetService.create(data.getName(),data.getArtifacts());      return mars;Planet 及其所有嵌套对象都有一个默认构造函数,例如:public Planet() {}但是,由于缺少默认构造函数,我无法创建新的行星对象。请帮忙!编辑:行星类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}神器类: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;}}元素类: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}}
查看完整描述

4 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

当我忘记@RequestBody参数之前时,我遇到了同样的错误


  @RequestMapping("/create")

  public Planet create(@RequestBody Planet data) {


查看完整回答
反对 回复 2022-06-15
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我不明白您面临的问题是什么,但我可以立即看到一个错误,因此猜测这是您面临的问题,我将为您提供解决方案。


创建一个与您的 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.


}


查看完整回答
反对 回复 2022-06-15
?
翻阅古今

TA贡献1780条经验 获得超5个赞

我想,它正在尝试调用new List()没有构造函数的调用。尝试ArrayList在您的签名中使用。

如果它以这种方式工作,那么您已经发现了错误。然后重新考虑调用方法的概念,因为您通常希望避免在方法签名中使用 List 的实现


查看完整回答
反对 回复 2022-06-15
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你应该写如下:


...

public String create(@RequestBody JSONObject requestParams) {

      String name=requestParams.getString("name");

      List<Planet> planetArtifacts=requestParams.getJSONArray("artifacts").toJavaList(Planet.Class);

...


查看完整回答
反对 回复 2022-06-15
  • 4 回答
  • 0 关注
  • 360 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号