2012-12-10 14 views
7

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".

+1

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. –

Odpowiedz

5

Może chciałbyś spróbować:

GenericEntity<Collection<Promotion>> genericEntity = 
      new GenericEntity<Collection<Promotion>>(promotions){}; 
return Response.ok().entity(genericEntity).build(); 
+1

Dziękuję bardzo! W końcu udało mi się to zrobić! – krajol

+1

To proste rozwiązanie, które działa bardzo dobrze, dziękuję za udostępnienie go! Jedynym minusem jest to, że musimy pamiętać, aby cały czas owijać nasze kolekcje w ten sposób. –

2

spróbuj dodać adnotację podtypy, tutaj jest przykładem, że używam. Może to rozwiązać Twój problem, określając wszystkie obsługiwane podtypy. Niestety nie przetestowaliśmy Twojego dokładnego przykładu.

0

Jeśli używałeś JAXB do generowania swoich zajęć, z pewnością możesz mieć coś takiego jak @XmlElements z różnymi typami do analizy listy.

Teraz, jeśli używasz również tych samych klas JAXB z Jersey/Jacksona, możesz ulepszyć metadane klasy, dodając @ jsonTypeInfo i @JsonSubTypes, aby opisać, jak sformatować nazwę listy/macierzy obiektów.

Podczas gdy @JsonTypeInfo opisuje typ, który ma zostać dodany, @JsonSubTypes udostępnia opcje załączonej kolekcji. Na przykład, As.PROPERTY, aby zdefiniować właściwość wyjścia, jak pokazano w przykładzie poniżej, gdzie lista elementów, które mogą mieć elementy różnych typów, w tym sam typ ("Form") oprócz 2 innych typów " Pole "i" Tabela ".

public class Form { 

    @XmlElements({ 
    @XmlElement(name = "field", type = Field.class), 
    @XmlElement(name = "form", type = Form.class), 
    @XmlElement(name = "table", type = Table.class) 
    }) 
    @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "obj") 
    @JsonSubTypes({ 
    @JsonSubTypes.Type(value = Field.class), 
    @JsonSubTypes.Type(value = Form.class), 
    @JsonSubTypes.Type(value = Table.class) 
    }) 
    @Generated(value = "com.sun.tools.internal.xjc.Driver", date = "2013-11-11T02:08:36-08:00", comments = "JAXB RI v2.2.4-2") 
    @JsonProperty("entities") 
    protected List<Object> fieldOrFormOrTable; 

szeregowanie obiektu przy użyciu domyślnych serializers Jackson Jersey z dodatkiem metadanych będzie następujący ...

 "entities": [ 
        { 
        "obj": "Table", 
        "row": { 
         "id": 1, 
         "fields": [ 
          { 
           "id": "DEBUGARY", 
           "type": "Text", 
           "kind": "user" 
          } 
         ] 
        }, 
        "id": "DBGARRAY" 
       }, 
       { 
        "obj": "field", 
        "id": "IDBG", 
        "type": "Text", 
        "kind": "user" 
       }, 
     ..., ..., ...] 
Powiązane problemy