Projekt Bilet #1 – pierwsze linijki kodu

By 6 lutego 2017Projekt Bilet

W poprzedniej części pisaliśmy o tym, czym jest Spring Boot oraz mniej więcej jakich technologii będziemy używać. Dzisiaj zainicjujemy i skonfigurujemy nasz projekt, a także uruchomimy pierwszy endpoint.

Uwaga – w kursie tym pominiemy stworzenie repozytorium oraz korzystanie z Git’a – jak stworzyć własne repozytorium oraz jak z niego korzystać szczegółowo opisywaliśmy w osobnym wpisie – gorąco zachęcamy do zapoznania się z nim i pracę nad własnym projektem za pomocą Gita!

Spring Initializr

Jednym z pierwszych zadań jest stworzenie szkieletu projektu – stworzenie projektu Mavenowego, uzupełnienie zależności, zainicjowanie aplikacji webowej itp. Nie jest to zbyt ciekawe, i na szczęście Spring pozwala nam ten proces uprościć! Pod nazwą Spring Initializr kryje się proste w użyciu narzędzie, które pozwoli wygenerować projekt o podstawowej strukturze z zależnościami i bazową konfiguracją.

Spring Initializr – ekran główny (i jedyny)

Dzięki temu wystarczy, że wybierzemy potrzebne moduły, uzupełnimy podstawowe informacje (nazwę pakietu bazowego, rodzaj projektu, wersję Spring Boot itp), i będziemy mogli pobrać podstawowy wygenerowany projekt. W naszym przypadku wybierzemy moduły, o których wiemy, że będziemy z nich korzystali – Web, JPA, Security, MySQL, H2 oraz Elasticsearch.

Pierwsze kroki

Nasza aplikacja jest już gotowa do uruchomienia! Zaimportuj ją w wybranym przez siebie środowisku ( o tym jak zrobić to w Eclipse, pisaliśmy w lekcji 7.1, sekcja ‚Importuj projekt/moduł’), aby móc z nią pracować bez przeszkód. Teraz już nic nie stoi na przeszkodzi i możemy ją uruchomić po prostu uruchamiając klasę pl.kobietydokodu.bilet.WebappApplication (uwaga – pakiet może się różnić, w zależności od opcji wybranych w Spring Initializr) tak jak każdą inną aplikację Javy. Efekt póki co nie powala na kolana – nasza aplikacja jeszcze nic nie robi ;) Po podaniu loginu i hasła (login to ‚user’, a hasło jest generowane losowo za każdym razem – znajdziesz je w logach aplikacji) widzimy domyślną stronę błędu:

Domyślna strona błędu 404

Wystawiamy endpoint

W tej lekcji wystawimy tylko prosty endpoint – po przekazaniu imienia, wygenerujemy proste przywitanie. Tworzymy więc klasę GreetingController, która będzie wyglądała następująco:

package pl.kobietydokodu.bilet.controller;

import java.util.Optional;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/greet")
public class GreetingController {

    @RequestMapping({"", "/{person}"})
    public String greetPerson(@PathVariable(name="person", required=false) Optional<String> maybePerson) {
        String person = maybePerson.filter(StringUtils::isNotBlank).orElse("unknown person");
        return String.format("Hello %s!", person);
    }

}

Sama funkcjonalność jest bardzo prosta – nasza metoda przyjmuje jeden (opcjonalny) parametr w adresie URL. Jeśli jest on podany (i niepusty), witamy daną osobę, w przeciwnym wypadku – witamy nieznaną osobę. Jeśli nie pamiętasz co dokładnie robiła adnotacja @PathVariable lub @RequestMapping, zajrzyj dla przypomnienia do lekcji 9!

Wszystko byłoby w porządku, gdyby nie to, że aplikacja nadal wymaga, abyśmy się logowali! Aby wyłączyć logowanie dla tej konkretnej metody, musimy dodać do pliku application.properties (znajdziesz go w katalogu src/main/resources) następującą linijkę:

security.ignored=/**

Zapewne ciekawi Cie jak to działa – o tym będziemy pisać w przyszłości, póki co najważniejsze, że nasze powitanie nie wymaga logowania się!

Testujemy nasz endpoint

Naszą aplikację możemy z powodzeniem przetestować wpisując adres bezpośrednio w przeglądarce – nie będzie to jednak możliwe jak zaczniemy tworzyć bardziej zaawansowane endpointy, przyjmujące obiekty i korzystające z innych metod HTTP.

Pomocne będzie tutaj narzędzie takie jak DHC czy Postman (narzędzi tych istnieje wiele więcej, te dwa są jednymi z najpopularniejszych) – w dalszej części kursu będziemy korzystać właśnie z DHC (nie wymaga on instalacji – można z niego korzystać wprost ze strony twórców, ale można także pobrać jako plugin do Chrome, co zalecamy).

Aby przetestować nasz endpoint, w okienku głównym uzupełniamy adres URL oraz opcjonalnie nazwę, nagłówki itp. W naszym przypadku wygląda to tak:

Widok główny programu DHC

Po wysłaniu zapytania możemy zobaczyć odpowiedź – nie tylko samą treść, ale także nagłówki i informacje pomocnicze:

Poprawna odpowiedź na zapytanie HTTP – status 200

Pozostałe opcje bardziej szczegółowo będziemy omawiać przy okazji implementowania kolejnych funkcjonalności. Zapraszamy do kolejnych lekcji już wkrótce!

Kod źródłowy

Przeglądaj kodPobierz ZIP

Kody źródłowe są dostępne w serwisie GitHub - użyj przycisków po prawej aby pobrać lub przejrzeć kod do tego modułu. Jeśli masz wątpliwości, jak posługiwać się Git’em, instrukcje i linki znajdziesz w naszym wpisie na temat Git’a.

Licencja Creative Commons

Jeśli uważasz powyższą lekcję za przydatną, mamy małą prośbę: polub nasz fanpage. Dzięki temu będziesz zawsze na bieżąco z nowymi treściami na blogu ( i oczywiście, z nowymi częściami kursu Javy). Dzięki!

  •  
  •  
  •  
  •  
  •  
  • Mateusz Socha

    Czyli sie zaczyna :) Czekam na wiecej!

  • Krzysztof

    No w końcu :) Również czekam na więcej. Tylko mi odpowiedzcie proszę na jedno pytanie. Dlaczego użyliście dwóch baz danych? MySQL i H2? H2 będzie na teraz, a docelowo MySQL czy jak?

    Pozdrawiam
    Krzysztof

    • Każda będzie miała swój profil, który ją będzie używał. Na spokojnie wszystko już niedługo się wyjaśni :)

  • Maciej

    Hmm… coś mi nie chce działać :(

    W tej linii: String person = maybePerson.filter(StringUtils::isNotBlank).orElse(„unknown person”);
    intellij twierdzi, że nie można napisać StringUtils::isNotBlank – Object cannot be converted to String.
    Czy macie jakiś pomysł w czym może być problem?

    Zrobiłem obejście po swojemu, ale to nie to samo jak w przykładzie :)

    Pozdrawiam.

    • Maciej

      hahah… dobra po dłuższej rozkminie udało mi się rozwiązać problem =]

      Przy deklaracji zmiennej maybePerson brakowało .
      Czyli powinno być … Optional maybePerson…..

  • Tad

    projekt bilet zawieszony bo wolno to idzie strasznie …a szkoda :(

    • Niestety ostatnio po prostu ciężko zorganizować nam trochę czasu na bloga, ale bardzo byśmy chcieli go kontynuować. Bądź dobrej myśli, a my postaramy się lepiej uporządkować kalendarz ;)

      • Tad

        jestem dobrej mysli :) i rozumiem jak z czasem
        pozdrawiam z Dublina

  • Krzysztof

    Cześć
    Domyślam się, że macie pełne ręce roboty ale zapytam. Kiedy będzie kolejna część kursu?
    Pozdrawiam

  • Krzysztof

    Śledzę bloga, co chwilę pojawiają się nowe wpisy, a co z projektem bilet? Będziecie go jeszcze kontynuować? Fajnie byłoby go skończyć, wykorzystać te kilka technologii w praktyce, o których wspominaliście, a tutaj już ponad 4 miesiące cisza…

    • Cześć Krzysztof! Niestety Kuba przez dłuższy moment nie miał czasu dokończyć swoich lekcji, niemniej, już w tym tygodniu powinna pojawić się kolejna, bo w końcu ma więcej czasu. Przepraszamy za opóźnienie, niestety, czasem ciężko jest nam wygospodarować czas na bloga.