我对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;
请更改您的JSON结构。
{ "title": "question", "content": "cogito", "tag": [{"tag":"java"},{"tag": "rest"}] }
也可以在映射中添加级联。
@OneToMany (cascade = CascadeType.ALL)
@Column (nullable = false)
private List<Tag> tag;