Сопоставить свойство объекта в POJO с указанным идентификатором из JSON - PullRequest
0 голосов
/ 14 ноября 2018

Прежде всего, извините, я не могу объяснить себя лучше.

Я программирую пример API, у меня есть POJO (с JPA) под названием Movie, поэтому в моем контроллере я хочу дать ему JSON для вставки Movie.

Фильм обладает свойством @ManyToOne(optional = false), относящимся к другому POJO под названием Genre (idGenre, Name)

Я хочу указать в 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 голосов
/ 14 ноября 2018

Вы поместили аннотации 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...