4 回答
TA贡献1873条经验 获得超9个赞
当我忘记@RequestBody参数之前时,我遇到了同样的错误
@RequestMapping("/create")
public Planet create(@RequestBody Planet data) {
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.
}
TA贡献1780条经验 获得超5个赞
我想,它正在尝试调用new List()没有构造函数的调用。尝试ArrayList在您的签名中使用。
如果它以这种方式工作,那么您已经发现了错误。然后重新考虑调用方法的概念,因为您通常希望避免在方法签名中使用 List 的实现
TA贡献1744条经验 获得超4个赞
你应该写如下:
...
public String create(@RequestBody JSONObject requestParams) {
String name=requestParams.getString("name");
List<Planet> planetArtifacts=requestParams.getJSONArray("artifacts").toJavaList(Planet.Class);
...
添加回答
举报
