Я совсем новичок в весне. У меня ошибка синтаксического анализа JSON, когда я пытаюсь использовать метод POST в Postman. По сути, у меня есть класс, который я хочу назвать другим в форме списка.
У меня есть абстрактная сущность, которую я использую для классов, затем у меня есть класс тегов;
@Entity
@Data
@EqualsAndHashCode(callSuper = true)
public class Tag extends AbstractEntity {
@Column (nullable = false)
private String tag;
И у меня есть класс вопросов:
@Entity
@Data
@EqualsAndHashCode(callSuper = true)
public class Question extends AbstractEntity {
@Column (nullable = false)
private String title;
@Column (nullable = false)
private String content;
@OneToMany
@Column (nullable = false)
private List<Tag> tag;
Здесь мой контроллер:
@RestController
@RequestMapping("v1/enquiry")
public class EnquiryController {
@Autowired
private QuestionRepository questionRepository;
@PostMapping
public ResponseEntity<Question> createEnquiry(@RequestBody Question question) {
if (question.getTitle() == null | question.getContent() == null) {
throw new BadRequest("Please fill in the required fields!");
}
Question enq = questionRepository.save(question);
return ResponseEntity.ok().body(enq);
}
Когда я выполняю метод POST с:
{
"title": "question",
"content": "cogito",
"tag": ["java", "rest"]
}
, я получаю следующую ошибку. Я довольно перепробовал все предложения по схожим условиям, размещенные вокруг Никто из них не работал. Что я делаю не так?
"message": "JSON ошибка синтаксического анализа: невозможно создать экземпляр com.mockup.mockupapi.model.Tag
(хотя существует хотя бы один создатель): нет конструктора аргумента строки / метода фабрики десериализовать из строкового значения ('java'); вложенным исключением является com.faster xml .jackson.databind.ex c .MismatchedInputException: Невозможно создать экземпляр com.mockup.mockupapi.model.Tag
(хотя существует хотя бы один создатель): нет конструктор аргумента строки / метод фабрики для десериализации из значения String ('java') \ n в [Source: (PushbackInputStream); строка: 4, столбец: 10] (через цепочку ссылок: com.mockup.mockupapi.model .Question [\ "tag \"] -> java .util.ArrayList [0]) ",
решено
Благодаря подсказкам в комментарии я изменил формат массива в JSON и добавил CascadeType
к OneToMany
вызову. Я использовал .PERSIST
, однако, .ALL
также работает.
Формат JSON:
{
"title": "question",
"content": "cogito",
"tag": [{"tag":"java"},{"tag": "rest"}]
}
Класс Вопрос:
@Entity
@Data
@EqualsAndHashCode(callSuper = true)
public class Question extends AbstractEntity {
@Column (nullable = false)
private String title;
@Column (nullable = false)
private String content;
@OneToMany(cascade = CascadeType.PERSIST)
@Column (nullable = false)
private List<Tag> tag;