Spring Jackson反序列化只选择数组的第一项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Jackson反序列化只选择数组的第一项相关的知识,希望对你有一定的参考价值。
我用弹簧靴建造一个api休息。我有一个亲子关系,把孩子当作一系列对象。
问题是反序列化只选择数组的第一项。其他一切似乎都很好。父级和子级也在数据库中被支持。
我发送这样的东西:
"user": {
"name": "foo",
"childs": [
{
"name": "bar",
....
},
{
"name": "foobar",
....
}
],
....
}
但坚持这个:
"user": {
"id": 1,
"name": "foo",
"childs": [
{
"id": 1,
"name": "bar",
....
}
],
....
}
这有什么线索吗?
Update
家长实体:
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = User.class)
@Entity( name = "users" )
@Table( name = "users" )
public class User extends ModelEntity {
Model's fields...
...
@JsonView( value = {DTOViews.PrivateProfile.class, DTOViews.Owner.class} )
@JsonManagedReference( value = "User-ProfessionalExperience" )
@OneToMany( mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private Set<ProfessionalExperience> professionalExperiences;
}
子实体:
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = ProfessionalExperience.class)
@Entity
@Table( name = "professional_experiences")
public class ProfessionalExperience extends ModelEntity {
Model's fields...
...
@JsonBackReference( value = "User-ProfessionalExperience" )
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
}
控制器:
@RequestMapping(method = RequestMethod.POST)
public MappingJacksonValue create(@RequestBody @Valid User userToCreate, BindingResult result) {
...
}
谢谢大家。
答案
所以,我终于解决了它。问题来自关系集合类型和hashCode()/ equals()方法。
我的模型中的所有实体都从“ModelEntity”类扩展而来。此类为所有扩展模型提供id和记录活动字段,并基于这些字段提供hasCode / equals方法。由于“User”和“ProfessionalExperience”之间的关系被定义为一个集合,它不能存储重复的元素。
因此,为了告诉jackson孩子们是不同的元素,我们需要在每个模型类中使用每个模型中定义的字段覆盖hashCode / equals。
以上是关于Spring Jackson反序列化只选择数组的第一项的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot - Jackson 日期序列化和反序列化
Spring + Jackson + joda time:如何指定序列化/反序列化格式?