Spring Rest Controller中获取JSON解析错误(MismatchedInputException)

问题描述 投票:1回答:1

我对Spring很陌生。我在Postman中尝试POST方法时遇到JSON解析错误。基本上,我有一个要以列表形式调用的类。

我有一个用于类的抽象实体,然后有一个标记类;

@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的实例(尽管至少存在一个Creator):没有从字符串值('java')反序列化的String-argument构造函数/工厂方法;嵌套的异常是com .fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.mockup.mockupapi.model.Tag的实例(尽管存在至少一个Creator):没有用于从[Source]的String值('java')\ n反序列化的String-argument构造函数/工厂方法:((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;
java spring rest jackson spring-restcontroller
1个回答
0
投票

请更改您的JSON结构。

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

也可以在映射中添加级联。

@OneToMany (cascade = CascadeType.ALL)
 @Column (nullable = false) 
 private List<Tag> tag;
© www.soinside.com 2019 - 2024. All rights reserved.