Ich schreibe einen REST-Dienst mit Jersey. Ich habe eine abstrakte Klasse Promotion, die eine Anmerkung hat:@JsonTypeInfo (verwenden = JsonTypeInfo.Id.CLASS) funktioniert nicht, wenn Antwort zurückgegeben wird
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
Dank, dass, wenn ich eine Liste von Objekten zurück:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("promotions/")
public List<Promotion> getClosestPromotions() {
List<Promotion> promotions = getPromotions(); //here I get some objects
return promotions;
}
ich eine JSON-String mit einem „@ Klasse“ -Feld erhalten für jedes Objekt in dieser Liste. Aber das Problem ist, dass, wenn ich wieder eine Antwort:
@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();
}
Ich bin fast die gleiche Liste bekommen, aber ohne zusätzliche „@class“ ein. Warum ist das und was kann ich tun, um eine Liste mit "@class" -Feld zu erhalten, die eine Liste in Response zurückgibt? Und übrigens, überraschend, es funktioniert, wenn ich eine Antwort mit einem Promotion-Objekt nur als eine Entität zurückgegeben und ich bekomme dieses "@class" -Feld.
Ich habe nicht genug für eine Antwort noch nicht, aber mit Jersey Jackson Standard Serializer mit dem zusätzlichen Metadaten. Die Entitätsmethode akzeptiert ein Objekt. Der zugrunde liegende Code prüft den Typ wahrscheinlich zur Laufzeit, um die Typinformationen wiederherzustellen. Leider wird es so weit gehen wie Liste und nicht Liste. Es schreibt es als eine Liste ohne generische Typinformationen, daher würden Sie das Klassenfeld verlieren. Das Schreiben eines Objekts, das die Liste als eine Mitgliedsvariable enthält, wird wahrscheinlich funktionieren, aber ich versuche, etwas saubereres zu finden. –