Java Hipster! Potrzebujemy więcej encji! JHipster tutorial part 4

Witam Cię w ten piękny poniedziałek!

Po miękkich rozważaniach z zeszłego tygodnia, wracamy dziś do developementu aplikacji MoocYourLife. Zanim jednak ruszymy dalej, podsumujmy obecny stan naszego projektu:

  • mamy wygenerowaną aplikację przy pomocy JHipstera
  • jest skonfigurowana w naszym ulubionym IDE
  • potrafimy ją uruchomić (na kilka różnych sposobów)
  • wszystko jest zdockerowane i działa 🙂

Zapraszam zatem na ciąg dalszy!

Potrzebujemy encji!

Podstawą modelu każdego projektu są przeważnie encje. Zazwyczaj, w aplikacji webowej, żeby dodać nową encję trzeba wykonać szereg czynności:

  • dodać tabelę w bazie danych
  • dodać klasę JPA w Javie oraz odpowiadającą jej klasę DAO
  • dodać jakiś serwis/kontroler, który pozwoli wykonać na niej podstawowe operacje CRUD (create, read, update, delete)
  • dodać odpowiedni widok w HTMLu
  • w przypadku Angulara, dodać komponent
  • przydałyby się jakieś testy na to wszystko

Dodatkowo, trzeba uwzględnić takie rzeczy jak relacje między encjami, ograniczenia i walidacje…

Także jak widzisz czynności jest sporo i przy każdorazowym dodawaniu encji będą one się powtarzać.

Odpalmy na chwilę naszą aplikację. Wpisujemy:

$ docker-compose -f src/main/docker/app.yml up

Na górze strony widzimy pasek i na nim przycisk „Encje”:

Obecnie pozycja jest pusta – nasza aplikacja nie ma encji. (Nie jest to do końca prawda, bo wraz z generowaniem kodu na początku, JHipster utworzył kilka encji potrzebnych do logowania się do systemu. Np. encję „User”. Na razie jednak pomińmy ten fakt.) Musimy zatem stworzyć nowe.

Generujemy encje

Szczęśliwie, żeby dodać nową encję nie musimy wykonywać żmudnej pracy opisanej powyzej. 🙂 Z pomoca przychodzi nam JHipster, który dostarcza narzędzi ułatwiających cały proces!

Stworzymy encję o nazwie „Course”. Odpalamy terminal w głównym katalogu projektu i wpisujemy:

$ yo jhipster:entity course

Uruchomiony zostanie generator Yeoman, który zada nam kilka pytań:

  1. Czy chcesz dodać pole do encji? Wpisujemy „Yes”.
  2. Jaka jest nazwa tego pola? Wpisujemy nazwę, w moim przypadku „name”.
  3. Następnie wybieramy typ nowego pola. W moim przypadku jest to „String”.
  4. Teraz decydujemy, czy chcemy dodać walidację do naszego pola. Jeżeli się na nią zdecydujemy, zostanie ona dodana w dwóch miejscach:
    1. w widokach HTML z użyciem mechanizmów walidacji Angulara
    2. w części backendowej aplikacji przy pomocy Java Bean Validation

I jeśli chodzi o pojedyncze pole to jest wszystko. Teraz możemy dodać więcej pół w analogiczny sposób.

Dodajmy zatem jeszcze pole „createDate” o typie „LocalDate”.

Po zdefiniowaniu wszystkich pól, JHipster zapyta nas o jeszcze kilka rzeczy:

  • czy chcemy dodać jakieś relacje pomiędzy inną encją? Póki co nie mamy innych encji, więc nie.
  • czy chcemy używać klas DTO? O co tu chodzi? Domyślnie nasze encje będą używane w REST kontrolerze. Możemy jednak to zmienić i wygenerować osobne klasy (odpowiadające encjom) używane po stronie RESTa. Te klasy będą następnie zamieniane przy pomocy DTO (Data Transfer Object) na encje. Takie podejście umożliwia dodanie dodatkowej warstwy logiki (np. dzięki temu możemy agregować kilku encji w jeden obiekt wyjściowy dostępny z poziomu końcówki RESTowej)
  • czy chcemy używać serwisów? Możemy w REST kontrolerze bezpośrednio korzystać z klas repozytorium (DAO) albo rozdzielić obie rzeczy dodatkową warstwą logiki, czyli właśnie serwisem.
  • czy chcemy włączyć paginację? Do wyboru jest albo paginacja przy pomocy przycisków „poprzedni” i „następny” albo przy poprzez „infinite scroll”.

Po udzieleniu wszystkich odpowiedzi JHipster wygeneruje odpowiednie pliki. Może się zdarzyć, że będziemy mieli konflikty w plikami Liquibase. W takim przypadku klikamy „overwrite”.

Niestety operacja nie zakończyła się sukcesem, otrzymałem taki komunikat:

sh: 1: webpack: not found
error Command failed with exit code 127.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Okazuje się, że zapomniałem zainstalować Webpacka… Trzeba to naprawić! Wpisujemy:

$ yarn global add webpack
$ yarn add --dev webpack

Update’ujemy encję

W sumie dobrze się stało, bo sprawdzimy teraz co się wydarzy, gdy jeszcze raz każemy JHipsterowi wygenerować tę samą encję:

$ yo jhipster:entity course

Generator widzi, że encja o takiej nazwie już istnieje, więc możemy albo przegenerować ją jeszcze raz, dodać do niej nowe pole albo usunąć już istniejące. Wybierzmy pierwszą opcję.

Jeśli wszystko się powiedzie, nowa encja zostanie wygenerowana. Zobaczmy co się zmieniło:

$ git status
zmodyfikowany: package.json
zmodyfikowany: src/main/java/org/piotr/moocyourlife/config/CacheConfiguration.java
zmodyfikowany: src/main/resources/config/liquibase/master.xml
zmodyfikowany: src/main/webapp/app/entities/entity.module.ts
zmodyfikowany: src/main/webapp/app/layouts/navbar/navbar.component.html
zmodyfikowany: src/main/webapp/i18n/en/global.json
zmodyfikowany: src/main/webapp/i18n/pl/global.json
zmodyfikowany: yarn.lock

Untracked files:

.jhipster/
src/main/java/org/piotr/moocyourlife/domain/Course.java
src/main/java/org/piotr/moocyourlife/repository/CourseRepository.java
src/main/java/org/piotr/moocyourlife/service/CourseService.java
src/main/java/org/piotr/moocyourlife/web/rest/CourseResource.java
src/main/resources/config/liquibase/changelog/20170326132150_added_entity_Course.xml
src/main/webapp/app/entities/course/
src/main/webapp/i18n/en/course.json
src/main/webapp/i18n/pl/course.json
src/test/gatling/simulations/
src/test/java/org/piotr/moocyourlife/web/rest/CourseResourceIntTest.java
src/test/javascript/e2e/entities/
src/test/javascript/spec/app/entities/

Widzimy, że dodanych zostało sporo nowych plików. Między innymi klasa encji, odpowiadające jej DAO, odpowiednia końcówka RESTowa czy nowe pliki dla Angulara. Gdyby nie JHipster, to wszystko musielibyśmy pisać ręcznie!

No dobrze, ale to co zrobiliśmy dzisiaj to dodaliśmy tylko jedną encję z zaledwie dwoma polami… Co jeżeli chcemy dodać więcej, dużych encji? Pomimo użycia takiego generatora, to wciąż będzie sporo pracy…

Tu na ratunek przychodzi JDL czyli JHipster Domain Language, dzięki któremu zamodelujemy od razu całą naszą aplikację i dodamy wszystkie encje na raz! Ale o tym w kolejnym wpisie. 🙂

Tymczasem do zobaczenia i…

NIECH KOD BĘDZIE Z TOBĄ!

4 komentarze

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *