在JSON中给定ID的POJO中映射对象属性

时间:2018-11-14 17:29:09

标签: spring jpa jackson

首先,对不起,我无法更好地解释自己。

我正在编写一个示例API,我有一个名为Movie的POJO(使用JPA),因此在我的控制器中,我想给它一个JSON来插入Movie。

电影具有@ManyToOne(optional = false)属性,与另一个名为GenreidGenreName)的POJO相关

我想提供一个不是带有所有属性的对象,而是一个id的JSON,所以:

CONTROLLER

@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"
 }

是否有可能实现这一目标?

1 个答案:

答案 0 :(得分:2)

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

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

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

    //....
}

,然后从您的Genre genre类的属性Movie中删除这些注释。 您还需要用@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
}