piątek, lutego 21, 2020

Czemu trzeba pomagać Jacksonowi? ;-)

Jeśli używasz w swoim projekcie Jacksona to pewnie zdarzyło Ci się zrobić pewien błąd.
Najpierw stworzyłeś lub stworzyłaś klasę z polami publicznymi, bo to przecież taki tylko obiekt do zmiany w JSONa i z powrotem.
I wszystko działało.
Aż tu nagle, dodajesz konstruktor i zmieniasz widoczność pól i nagle choć serializacja nadal działa to deserializacja przestaje.

Patrzysz na kod i w końcu dociera do Ciebie, że trzeba opisać konstruktor annotacją @JsonCreator.

I czasem kod działa :-)

A czasem jednak nie. I znów dociera do Ciebie, że trzeba dodać do parametrów annotacje @JsonProperty z nazwą.

Tu możesz się zacząć zastanawiać czemu jak pole było publiczne to nic nie trzeba było annotować, a jak jest prywatne i dostarczasz konstruktor to nagle trzeba już dodać annotację z nazwą...

Reflejske się tu kłaniają ;-)

Jackson używa do serializacji i deserializacji mechanizmu refleksji.

Pola sobie może odczytać bez problemu, robi na naszym serializowanym obiekcie obj.getClass().getDeclaredFields() i obj.getClass().getFields() i ma listę pól z ich nazwami i typem.

Ale jak jest konstruktor to sprawa się komplikuje.... bo co prawda przy pomocy refleksji można zdobyć info o konstruktorach, a nawet o ich parametrach.... to ich nazwy są tracone w trakcie kompilacji ;-)

Można to zobaczyć uruchamiając poniższy program:

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class ReflectionTest {

ReflectionTest(String id, String name) {
System.out.println(id);
System.out.println(name);
}

public static void main(String[] args) {
Constructor<?>[] constructors = ReflectionTest.class.getDeclaredConstructors();
for (Constructor<?> constructor:constructors) {
Parameter[] parameters = constructor.getParameters();
for (Parameter parameter:parameters) {
System.out.println(parameter.getName());
}
}
}
}

Co wypisze? ;-)

Spodziewalibyśmy się, że:
id
name

a tak naprawdę wypisuje:
arg0
arg1

 ;-)


Podobne postybeta
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Refleksje i serializacja w Java'ie - podstawy i obalanie mitów ;-)
Sztuczki tropiciela błędów, part 4
Serializacja w Java'ie - revisited ;-)
Konstruktory

Brak komentarzy:

Prześlij komentarz