Tworzenie obiektów w Groovy i Grails
W Groovy istnieje możliwość podawania wartości jakie zostaną przypisane do właściwości obiektu w konstruktorze, bez wcześniejszego jawnego definiowania takiego konstruktora.
Jak to wygląda w kodzie:
class Person { String firstname String lastname } def p1 = new Person() def p2 = new Person(firstname:"Mateusz") def p3 = new Person(lastname:"Mrozewski") def p4 = new Person(firstname:"Mateusz", lastname:"Mrozewski")
Jest to całkiem wygodna konstrukcja. Co jednak w sytuacji, gdy podamy właściwość, która nie istnieje:
def p5 = new Person(wiek:27)
Sam Groovy bardzo grzecznie zgłasza w takiej sytuacji groovy.lang.MissingPropertyException. A co się stanie jak taki kod wywołamy gdzieś w kontrolerze Grails? Nic się nie stanie - dosłownie nic
Natrafiłem na przypadek, gdy z powodu literówki nie mogłem znaleźć błędu. Ani w bazie nie pojawiał się rekord, którego oczekiwałem (tworzyłem instancję klasy domenowej), ani nie dostawałem żadnego wyjątku, ani chociaż komunikatu. Nie wiem, czy można włączyć jakiś bardziej szczegółowy poziom logowania na tą okazję. Póki co już pamietam, że trzeba z tym uważać
W Grails jest jeszcze ciekawiej, bo można stworzyć egzemplarz obiektu na podstawie przesyłanej mapy atrybutów params, tj. def p1 = new Person(params). Oznacza to ni mniej ni więcej, weź wszystkie wartości atrybutów z mapy params. Zatem u Ciebie mogłoby to być params.firstname, params.lastname. A skąd te wartości – z formularza, bądź explicite podane w URLu. Grails zadba, aby te parametry były poustawiane. Ciekawie robi się, kiedy chcielibyśmy zainicjować atrybuty, które są złożone, np. gdyby Person zawierał w sobie Person, to konstruktor z params ustawiłby również wartości dla tego wewnętrznego Person, jeśli napotkałby parametry o nazwie person.*, tj. params.person.*. Bajka!
Jacek
Notatnik Projektanta Java EE