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