Inicjalizacja danych w zależności od trybu uruchomienia aplikacji Grails
Pisząc aplikacje w Grails niejednokrotnie stajecie przed koniecznością wykonania pewnej logiki podczas startu aplikacji, logika taka to np. dodanie użytkownika do bazy danych, zapisanie podstawowych i zarazem koniecznych do działania aplikacji danych w bazie.
Logika taka powinna zostać zawarta w klasie BootStrap znajdującej się w katalogu conf Waszej aplikacji. Początkowa postać tej klasy to:
def init = { servletContext ->
}
def destroy = {
}
}
W bloku init możecie umieścić kod, który zostanie wywołany podczas uruchomienia aplikacji, blok destroy powinien zawierać operacje, które mają zostać wykonane podczas zakończenia aplikacji - zakończenie takie musi odbyć się w sposób standardowy, zakończenie wykonania aplikacji spowodowane sytuacją nadzwyczajną nie spowoduje wykonania instrukcji zawartych w bloku destroy.
Dodajmy do powyższej klasy kod, który zostanie wykonany podczas startu naszej aplikacji:
def init = { servletContext ->
new User(username: ‘admin’, password: ‘admin’).save()
}
def destroy = {
}
}
W ten sposób zapisujemy użytkownika o loginie admin i haśle admin, oczywiście musimy mieć utworzoną klasę domenową User z odpowiednimi polami
Teraz podczas startu naszej aplikacji nasz przykładowy użytkownik będzie zawsze dodawany do bazy,
pytanie co zrobić gdy chcemy wykonać logikę w zależności od środowiska w którym uruchamiamy aplikację, jak wiadomo standardowo mamy trzy środowiska: development, test, production. Uruchomienie aplikacji w konfiguracji odpowiadającej określonemu środowisku odbywa się poprzez wykonanie komendy grails run-app z odpowiednim parametrem, np.:
Powyższa komenda uruchomi aplikację w trybie produkcyjnym.
Dobra, pojawia się teraz pytanie jak w klasie BootStrap sprawdzić w jakim trybie została uruchomiona nasza aplikacja?
Odpowiedź jest bardzo prosta, użyjemy do tego celu takiego oto fragmentu kodu:
Jest to wywołanie statycznej metody getEnvironment, znajdującej się w klasie GrailsUtil (dla niewtajemniczonych wywołania getterów w Groovy wyglądają jak odwołania do pól klasy). Teraz zmienna env będzie zawierała wartość dzięki której będziemy w stanie zidentyfikować rodzaj trybu w jakim uruchomiona została aplikacja, będą to odpowiednio: test, development, production dla trybów: testowego, developerskiego, produkcyjnego.
Teraz nie pozostaje nam nic innego jak uzależnić od zwróconej wartości wykonanie odpowiedniego kodu, można tu standardowo zastosować instrukcję if-else, można też to zrobić sprytniej i wykorzystać dobrodziejstwa jakie daje nam Groovy:
def init = { servletContext ->
def env = GrailsUtil.environment
InitializeData.“$env”()
}
def destroy = {
}
}
Co oznacza powyższy blok kodu, a w szczególności tajemnicza konstrukcja InitializeData.”$env”()?
A więc dzięki niej w bardzo ciekawy sposób rozdzieliliśmy wykonanie kodu zależnego od trybu w którym została uruchomiona aplikacja, umieszczając go w klasie InitializeData w jej statycznych metodach:
static void development() {
//kod wykonywany dla środowiska developerskiego
}
static void test() {
//kod wykonywany dla środowiska testowego
}
static void production() {
//kod wykonywany dla środowiska produkcyjnego
}
}
Zastosowana konstrukcja InitializeData.”$env”() służy do wywołania statycznej bezparametrowej metody o nazwie odpowiadającej wartości zmiennej env, która została zdefiniowana w klasie InitializeData
COMMENTS
3 Responses to “Inicjalizacja danych w zależności od trybu uruchomienia aplikacji Grails”
Leave a Reply











Przez Twoje artykuły chyba zainteresuję się groovym
Hej,
naprawdę warto. Na początek szczególnie polecam książkę “Programming Groovy: Dynamic Productivity for the Java Developer”, której recenzję pewnie widziałeś już wcześniej w jednym z moich wpisów.
Co do samego Groovy’ego to mogę Ci powiedzieć, że nie myślałem, iż istnieje język który tak bardzo by mi odpowiadał
Można jeszcze dodać metodę methodMissing do klasy InitializeData, aby w przypadku nieznanego środowiska nie leciał wyjątek groovy.lang.MissingMethodExceptio