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

Spring 在给定JSON ID的POJO中映射对象属性,spring,jpa,jackson,Spring,Jpa,Jackson,首先,对不起,我无法更好地解释我自己 我正在编写一个示例API,我有一个名为Movie的POJO(带有JPA),所以在我的控制器中,我想给它一个JSON来插入一部电影 电影有一个@ManyToOne(optional=false)属性,与另一个名为Genre的POJO相关(idGenre,Name) 我想在JSON中给出一个id,而不是每个属性都有一个对象,因此: 控制器 @RequestMapping(value = "/sendMovie", method = RequestMethod.P

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

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

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

我想在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;
{
  "name": "MATRIX",
  "idGenre": 3,
  "synopsis": "NEO DOING THINGS",
  "poster": "matrix.jpg",
  "director": "WACHOWSKIS"
 }
我想使用的JSON

@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;
{
  "name": "MATRIX",
  "idGenre": 3,
  "synopsis": "NEO DOING THINGS",
  "poster": "matrix.jpg",
  "director": "WACHOWSKIS"
 }

有可能实现吗?

您确实将
JsonIdentity…
注释放错了位置

您需要在
@Genre
类中添加以下注释:

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

    //....
}
并从
电影
类中的属性
流派
中删除这些注释。 你还需要告诉Jackson你想要这个属性 使用名称
“idGenre”
序列化

然后JSON输出将如下所示:

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

您确实将
JsonIdentity…
注释放错了位置

您需要在
@Genre
类中添加以下注释:

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

    //....
}
并从
电影
类中的属性
流派
中删除这些注释。 你还需要告诉Jackson你想要这个属性 使用名称
“idGenre”
序列化

然后JSON输出将如下所示:

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

当然设计一个与您想要发送和接收的JSON相匹配的类,与Movie类不同,我们称之为MovieCreationCommand。当您在控制器中收到MovieCreationCommand时,创建一部电影,通过从命令中获取其所有属性来初始化其属性,并使用命令中找到的流派ID从数据库中获取流派,然后插入该电影。确定。设计一个与您想要发送和接收的JSON相匹配的类,与Movie类不同,我们称之为MovieCreationCommand。当您在控制器中收到MovieCreationCommand时,创建一个电影,通过从命令中获取其所有属性来初始化其属性,并使用命令中找到的流派ID从数据库中获取流派,然后插入该电影。非常感谢您,Thomas,但我想将该JSON作为输入,将新电影添加到DB中,当我使用这个
com.fasterxml.jackson.databind.desr.UnsolvedForwardReference:UnsolvedForwardReference时,我得到了一个JSON解析错误:
非常感谢,Thomas,但我想把这个JSON作为输入,将一部新电影添加到DB中,使用此
com.fasterxml.jackson.databind.desr.UnsolvedForwardReference:UnsolvedForwardReference for: