【问题标题】:Map an Object Property in a POJO given an ID from a JSON给定来自 JSON 的 ID 映射 POJO 中的对象属性
【发布时间】:2018-11-14 17:29:09
【问题描述】:

首先,抱歉,我无法更好地解释自己。

我正在编写一个示例 API,我有一个名为 Movie 的 POJO(带有 JPA),所以在我的控制器中,我想给它一个 JSON 来插入电影。

Movie 有一个 @ManyToOne(optional = false) 属性,关联另一个名为 Genre 的 POJO(idGenreName

我想在 JSON 中给出一个不是每个属性的对象,而是一个 id,所以:

控制器

@RequestMapping(value = "/sendMovie", method = RequestMethod.POST)
public void setMovie(@RequestBody Movie movie) {
    mRepo.save(movie);
}

电影

@Entity
public class Movie {

    @Id
    @Column(name = "ID_MOVIE", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long idMovie;

    @Column(name = "NAME")
    private String name;

    @Column(name = "SYNOPSIS")
    private String synopsis;

    @Column(name = "POSTER")
    private String poster;

    @Column(name = "DIRECTOR")
    private String director;

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idGenre")
    @JsonIdentityReference(alwaysAsId = true)
    @ManyToOne(optional = false)
    @JoinColumn(name = "ID_GENRE", referencedColumnName = "ID_GENRE")
    private Genre genre;

我想使用的 JSON

{
  "name": "MATRIX",
  "idGenre": 3,
  "synopsis": "NEO DOING THINGS",
  "poster": "matrix.jpg",
  "director": "WACHOWSKIS"
 }

有没有可能做到这一点?

【问题讨论】:

  • 当然。设计一个与你要发送和接收的 JSON 匹配的类,与 Movie 类不同,我们称之为 MovieCreationCommand。当您在控制器中收到 MovieCreationCommand 时,创建一个 Movie,通过将其从命令中取出来初始化其所有属性,并使用在命令中找到的流派 ID 从数据库中获取流派,然后插入该电影。

标签: spring jpa jackson


【解决方案1】:

您确实将 JsonIdentity... 注释放在了错误的位置。

您需要将这些注释放在您的 @Genre 类中:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idGenre")
@JsonIdentityReference(alwaysAsId = true)
public class Genre {
    @Id
    @Column(...)
    private Long idGenre;

    //....
}

并从 Movie 类中的属性 Genre genre 中删除这些注释。 您还需要通过@JsonProperty("idGenre") 告诉杰克逊您想要此房产 以名称"idGenre" 进行序列化。

@ManyToOne(optional = false)
@JoinColumn(name = "ID_GENRE", referencedColumnName = "ID_GENRE")
@JsonProperty("idGenre")
private Genre genre;

那么 JSON 输出会是这样的:

{
  "name": "MATRIX",
  "synopsis": "NEO DOING THINGS",
  "poster": "matrix.jpg",
  "director": "WACHOWSKIS",
  "idGenre": 3
}

【讨论】:

  • 非常感谢,Thomas,但我想将该 JSON 作为输入以将新电影添加到数据库中,使用 com.fasterxml.jackson.databind.deser.UnresolvedForwardReference: Unresolved forward references for: 时出现 JSON 解析错误
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2019-01-09
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多