Spring-boot, отношение один ко многим в одном и том же объекте (родитель и дети) - PullRequest
0 голосов
/ 09 марта 2020

В моем проекте весенней загрузки я хочу создать объект «Меню» с родительскими и дочерними значениями:
- Меню может иметь Один родительский элемент
- Меню может иметь Один или множество детских элементов

Меню сущностей. java

@Entity
@Data @AllArgsConstructor @NoArgsConstructor
public class Menu implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany
    private List<Menu> childrens;

    @ManyToOne
    private Menu parent;

}

MenuDAO. java

@RepositoryRestResource
public interface MenuDAO extends JpaRepository<Menu, Long> {

}

DemoApplication. java чтобы добавить данные для теста с помощью CommandLine Runner:

  • Menu1 (родительский)
  • Подменю1 (дочерние элементы ) Menu1 )
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

   @Autowired
   MenuDAO menuDAO;

   public static void main(String[] args) {
       SpringApplication.run(DemoApplication.class, args);
   }

   @Override
   public void run(String... args) throws Exception {
       Menu m1 = menuDAO.save(new Menu(null,"Menu1",null,null));
       Menu m2 = menuDAO.save(new Menu(null,"Sub-Menu1",null,m1));

   }
}

Но когда я получаю родительский элемент с вызовом службы отдыха, я получаю этот результат http://localhost: 9090 / menus / 1 :

{
 "name" : "Menu1",
 "_links" : {
   "self" : {
     "href" : "http://localhost:9090/menus/1"
   },
   "menu" : {
     "href" : "http://localhost:9090/menus/1"
   },
   "childrens" : {
     "href" : "http://localhost:9090/menus/1/childrens"
   },
   "parent" : {
     "href" : "http://localhost:9090/menus/1/parent"
   }
 }
}

Но мое требование состоит в том, чтобы получить данные в следующем формате JSON:

{
"name" : "Menu1",
"childrens" : [{
                 "name" : "Menu2"
              }], 
"parent" : NULL,
"_links" : {
  "self" : {
    "href" : "http://localhost:9090/menus/1"
  },
  "menu" : {
    "href" : "http://localhost:9090/menus/1"
  },
  "childrens" : {
    "href" : "http://localhost:9090/menus/1/childrens"
  },
  "parent" : {
    "href" : "http://localhost:9090/menus/1/parent"
  }
}
}

любое предложение?

1 Ответ

0 голосов
/ 15 марта 2020

Наконец, у меня есть ответ после прочтения документации Справочное руководство по REST Spring Data
REST Spring Data представляет представление по умолчанию для модели домена, которую вы экспортируете. но если нам может понадобиться изменить представление этой модели по различным причинам, мы можем использовать проекции и выдержки для обслуживания упрощенных и сокращенных видов ресурсов.
В моем случае первым шагом является создание Prejection Интерфейс моей сущности Меню и выберите все атрибуты, которые я хочу найти в ответе JSON.

@Projection(name = "MenuProjection", types = Menu.class)
public interface MenuProjection {
    Long getId();

    String getName();

    Menu getParent();

    List<Menu> getChildrens();

}

Второй шаг - добавить свойство excerptProjection из RepositroyRestRessource аннотация с Menu.Class значением в моем интерфейсе MenuRepository . @RepositoryRestResource(excerptProjection = MenuProjection.class) JSON Ответ до

{
  "_embedded" : {
    "menus" : [ {
      "name" : "cat_test1",
      "_links" : {
        "self" : {
          "href" : "http://localhost:9292/menus/1"
        },
        "menu" : {
          "href" : "http://localhost:9292/menus/1"
        },
        "parent" : {
          "href" : "http://localhost:9292/menus/1/parent"
        },
        "pages" : {
          "href" : "http://localhost:9292/menus/1/pages"
        },
        "children" : {
          "href" : "http://localhost:9292/menus/1/children"
        }
      }
    }, {
      "name" : "cat_test2",
      "_links" : {
        "self" : {
          "href" : "http://localhost:9292/menus/2"
        },
        "menu" : {
          "href" : "http://localhost:9292/menus/2"
        },
        "parent" : {
          "href" : "http://localhost:9292/menus/2/parent"
        },
        "pages" : {
          "href" : "http://localhost:9292/menus/2/pages"
        },
        "children" : {
          "href" : "http://localhost:9292/menus/2/children"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:9292/menus{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:9292/profile/menus"
    },
    "search" : {
      "href" : "http://localhost:9292/menus/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}

JSON с проекцией

{
  "_embedded" : {
    "menus" : [ {
      "name" : "cat_test1",
      "parent" : null,
      "id" : 1,
      "childrens" : [ {
        "name" : "cat_test2"
      } ],
      "_links" : {
        "self" : {
          "href" : "http://localhost:9292/menus/1"
        },
        "menu" : {
          "href" : "http://localhost:9292/menus/1{?projection}",
          "templated" : true
        },
        "childrens" : {
          "href" : "http://localhost:9292/menus/1/childrens{?projection}",
          "templated" : true
        },
        "parent" : {
          "href" : "http://localhost:9292/menus/1/parent{?projection}",
          "templated" : true
        },
        "pages" : {
          "href" : "http://localhost:9292/menus/1/pages"
        }
      }
    }, {
      "name" : "cat_test2",
      "parent" : {
        "name" : "cat_test1",
      },
      "id" : 2,
      "childrens" : [ ],
      "_links" : {
        "self" : {
          "href" : "http://localhost:9292/menus/2"
        },
        "menu" : {
          "href" : "http://localhost:9292/menus/2{?projection}",
          "templated" : true
        },
        "childrens" : {
          "href" : "http://localhost:9292/menus/2/childrens{?projection}",
          "templated" : true
        },
        "parent" : {
          "href" : "http://localhost:9292/menus/2/parent{?projection}",
          "templated" : true
        },
        "pages" : {
          "href" : "http://localhost:9292/menus/2/pages"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:9292/menus{?page,size,sort,projection}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:9292/profile/menus"
    },
    "search" : {
      "href" : "http://localhost:9292/menus/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}

Итак, с помощью Spring Data Projection мы можем включить поля данных в ресурс сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...