Не найден основной или конструктор по умолчанию для интерфейса java.util.List Rest API Spring boot - PullRequest
0 голосов
/ 13 февраля 2019

Я передаю тело запроса в POST-запрос к почтальону, подобный следующему:

 "name":"Mars",
"artifacts":[
   {
      "elements":[
         {
            "name":"carbon",
            "amount":0.5,
            "measurement":"g"
         }
      ],
      "typeName":"typeA"
   },
   {
      "elements":[
         {
            "name":"hydrogen",
            "amount":0.2,
            "measurement":"g"
         }
      ],
      "typeName":"typeB"
   }
]

Метод создания в контроллере остатка выглядит следующим образом.

  @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 ]

0 голосов
/ 01 августа 2019

У меня была эта ошибка, когда я забыл @RequestBody перед параметром

  @RequestMapping("/create")
  public Planet create(@RequestBody Planet data) {
0 голосов
/ 13 февраля 2019

Я не понимаю, с какой проблемой вы сталкиваетесь, но я сразу вижу ошибку, поэтому предположив, что это проблема, с которой вы столкнулись, я собираюсь дать вам решение.

Создатькласс, который соответствует вашей структуре данных 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();
  }

Редактировать: Глядя на класс Планета, он также нуждается в некоторой модификации

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.

}

Надеюсь, это решит вашу проблему.

0 голосов
/ 13 февраля 2019

Я думаю, он пытается вызвать new List(), у которого нет конструктора.Попробуйте использовать new ArrayList<>() в своих подписях.

Если это работает таким образом, вы нашли ошибку.Затем переосмыслите свою концепцию вызова методов, так как обычно вы хотите избежать использования реализаций List в сигнатурах методов

0 голосов
/ 13 февраля 2019

вы должны написать, как показано ниже:

...
public String create(@RequestBody JSONObject requestParams) {
      String name=requestParams.getString("name");
      List<Planet> planetArtifacts=requestParams.getJSONArray("artifacts").toJavaList(Planet.Class);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...