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框架中的Jackson反序列化错误处理

Spring Boot Jackson - 日志记录

Spring boot - Jackson 日期序列化和反序列化

Spring + Jackson + joda time:如何指定序列化/反序列化格式?

Spring Boot 1.4 自定义内部 Jackson 反序列化

你能配置 Spring 控制器特定的 Jackson 反序列化吗?