Kategorie
Java

Adnotacje w Javie na przykładzie własnego konwertera JSON

Hej, dziś pokażę jak działają adnotacje w Javie na przykładzie prostego konwertera obiektu do formatu JSON.

Po co nam adnotacje? To wygodny sposób na konwertowanie danych, albo sterowanie zachowaniem programu po podstawie oznaczeń na polach, klasach i metodach. Zapewne spotkałeś/aś się z adnotacjami podczas implementowania bibliotek ORM (np. Hibernate) albo Jersey lub miałeś do czynienia z frameworkiem Spring Boot.

Ten wpis nie wyjaśni ci pojęcia refleksji w Javie, ale jeśli zostawisz like’a na stronie FB, lub zapiszesz się na newsletter, to na pewno nie ominie cię wpis o refleksach w Javie, który zamierzam napisać 🙂

Od razu przejdę do konkretów i utworzę klasę reprezentującą model danych:

Jak widać powyżej, jest to zwykła klasa modelowa Movie, która posiada pola prywatne oraz getter i settery.

Teraz zajmę się tworzeniem kilku klas reprezentujących adnotacje. Chciałbym oznaczać klasy modelowe i wskazywać w ten sposób zasoby, które podlegają konwersji na JSON:

Objaśnienie linijka po linijce:

@Retention(RetentionPolicy.RUNTIME) oznacza, że adnotacja ma być czytana podczas kompilacji programu.

@Target(ElementType.TYPE) dotyczy miejsca, które może zostać oznaczone naszą adnotacją. TYPE oznacza klasę. Jeszcze jest m.in METHOD oraz FIELD co jasno oznacza przeznaczenie adnotacji.

public @interface ModelToJson to inicjalizacja klasy, która jest interfejsem. Adnotacje dodatkowo mają przedrostek @ przed słowem kluczowym interface.

Reasumując, adnotacja @ModelToJson będzie używana do oznaczania klasy modelowej przeznaczonej do konwersji.

Poniżej tworzę adnotację, która będzie oznaczać pole klasy, jako biorące udział w konwersji na format JSON. Innymi słowy, pole nie oznaczone tą adnotacją zostanie pominięte podczas konwersji modelu na JSON.

Dodałem abstrakcyjna metodę String key() i oznaczyłem ją domyślnie na wartość pustego stringa. Dzięki temu, będzie można zmienić nazwę konwertowanego pola na dowolną zawartą w adnotacji.

Dorzucam klasę własnego wyjątku, choć nie jest to niezbędne:

Teraz czas na implementację logiki konwertera, czyli metody, które przekonwertują model Movie na stringowego JSONa. Poniżej pojedyncze metody z yjaśnieniem działania, a na samym dole cała klasa już „sklejona” 🙂

metoda: checkIfSerializable():

Powyższa metoda przyjmuje ogólny obiekt jako parametr i za pomocą refleksji sprawdza, czy posiada adnotację @ModelToJson.

Metoda getJsonString():

Powyższa metoda przyjmuje ogólny objekt jako parametr i za pomocą refleksji pobiera dane o polach klasy oraz spradza, czy pole posiada adnotację @JsonElement, jeśli posiada, to konwertuje tworząc stringa z kluczy (nazwa pola) i wartości (wartość pola).

Metoda getKey() sprawdza, czy nazwa pola musi zostać zmieniona na wartość z adnotacji, jeśli nie, to zostawia oryginalną nazwę pola.

Metoda convertToJson() służy jako główna metoda konwersji i będzie wywoływana wraz z przekazaniem modelu. Wykorzystałem tutaj również wyjątek rzucany podczas błędu konwersji. Obecna implementacja nie rozwiązuje problemu konwersji tablic na JSON, dlatego ten wyjątek się przyda 🙂

Poniżej cała klasa ClassToJsonConverter:

Mam nadzieję, że zachęciłem cię do dalszej zabawy z konwerterem oraz refleksą w Javie. Pamiętaj o FB 🙂

Tutaj znajdziesz kod w repozytorium do powyższego przykładu.

Powodzenia 🙂

[vicomi_feelbacks]