Получение ошибки разбора JSON (MismatchedInputException) в Spring Rest Controller - PullRequest
1 голос
/ 15 февраля 2020

Я совсем новичок в весне. У меня ошибка синтаксического анализа 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;

1 Ответ

1 голос
/ 15 февраля 2020

Пожалуйста, измените структуру JSON.

{ "title": "question", "content": "cogito", "tag": [{"tag":"java"},{"tag": "rest"}] }

Также добавьте каскад в ваше отображение.

@OneToMany (cascade = CascadeType.ALL)
 @Column (nullable = false) 
 private List<Tag> tag;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...