Как десериализовать Json с вложенным массивом объектов в простом приложении Spring Boot

#java #json #spring-boot #jackson #http-post

#java #json #spring-boot #джексон #http-post

Вопрос:

POST-запрос Json выглядит следующим образом:

    {
   'title':'Star Wars: The Empire Strikes Back',
   'description':'Darth Vader is adamant about turning Luke Skywalker to the dark side.',
   'actors':[
      {
         'lastName':'Ford',
         'name':'Harrison'
      },
      {
         'lastName':'Hamill',
         'name':'Mark'
      }
   ]
  }
  

Итак, мое приложение Spring Boot просто хочет сохранить весь этот json как класс «Film», а внутри него есть встроенный массив «Актеров». Вот модель фильма:

     @Entity
    public class Film {

      @Id
      @GeneratedValue
      private long id;
      private String title;
      private String description;
    
      private ArrayList<Actor> actors = new ArrayList<>();
  

У меня есть отдельная сущность для актера, которая выглядит аналогично:

     @Entity
    public class Actor {

      @Id
      @GeneratedValue
      private long id;
      private String name;
      private String lastName;
  

Наконец, я использую аннотацию RequestBody в PostMapping в контроллере:

     @PostMapping(value= "/api/film")
    @ResponseStatus(HttpStatus.CREATED)
    public Film addFilm(@RequestBody Film film) {
       service.createFilm(film);
       return film;
  

Проблема в том, что я всегда получаю исключение java.io.NotSerializableException, что актер не может быть сериализован. Я попытался сделать Actor статическим встроенным классом, но это ничего не изменило. У кого-нибудь есть идея, что здесь не так?

Комментарии:

1. Вы пытались установить какую-либо связь между фильмом и актером?

2. Ну, фильм содержит список действующих лиц. В ответ я хочу то же самое, что и мой запрос, за исключением уникального идентификатора, сгенерированного для каждого фильма или актера

Ответ №1:

Ваш класс Actor должен реализовать Serializable.

 @Entity
public class Actor implements Serializable{

  @Id
  @GeneratedValue
  private long id;
  private String name;
  private String lastName;
  

Комментарии:

1. Спасибо, это фактически избавило от ошибки! Единственное, что в id ответа для Actor всегда равно 0. Есть идеи, почему он не генерируется автоматически, как в фильме?

2. На самом деле понял это, благодаря добавлению Serializable все исправлено.