Piszę usługę REST za pomocą Jersey. Mam klasa abstrakcyjna Promotion, która ma adnotację:@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS) nie działa po zwróceniu odpowiedzi
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
Dzięki temu, kiedy zwraca listę obiektów:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("promotions/")
public List<Promotion> getClosestPromotions() {
List<Promotion> promotions = getPromotions(); //here I get some objects
return promotions;
}
otrzymuję ciąg JSON z „@class” pola dla każdy obiekt na tej liście. Ale problem polega na tym, że jeśli zwrócę odpowiedź:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("promotions/")
public Response getClosestPromotions() {
List<Promotion> promotions = getPromotions(); //here I get some objects
return Response.ok().entity(promotions).build();
}
Otrzymuję prawie taką samą listę, ale bez dodatkowego pola "@klasa". Dlaczego tak jest i co mogę zrobić, aby uzyskać listę z polem "@class" zwracającą listę w odpowiedzi? A tak na marginesie, zadziwiająco, działa to, kiedy zwracam Odpowiedź z jednym obiektem Promocji, podanym tylko jako encja i otrzymuję to pole "@class".
nie mam wystarczająco na odpowiedź, ale jeszcze. Metoda encji akceptuje obiekt. Kod źródłowy prawdopodobnie sprawdza typ w czasie wykonywania, aby odzyskać informacje o typie. Niestety dostanie się to do listy, a nie do listy. Zapisuje go jako listę bez informacji ogólnych, dlatego stracisz pole klasy. Pisanie obiektu, który ma listę jako zmienną składową, prawdopodobnie będzie działać, ale próbuję wymyślić coś czystszego. –