2016-05-13 12 views
2

Wir haben einen Front-End-Dienst, der einen Back-End-Dienst verwendet, um eine Liste der Metrikobjekte abzurufen. Wir haben ein Java ClientSDK für den Back-End-Service geschrieben, um die Entwicklung von Client-Anwendungen dieses Dienstes zu erleichtern.Verfügbarmachen einer Teilmenge eines Java-Objekts für JSON

Wir stellen auch eine Liste von Metriken aus dem Front-End-Service zur Verfügung. Momentan werden die Back-End-Metrikobjekte direkt in JSON ausgelagert und konvertiert.

Meine Sorge ist, dass, wenn Änderungen am Back-End-Metrik-Objekt vorgenommen werden - sagen ein Entwickler fügt ein neues geheime ID-Feld - wir wollen nicht aus dem Front-End-Service verfügbar machen.

Wir schreiben auch eine ClientSDK für den Front-End-Service. Wir möchten die Metrikklasse nicht vom Back-End-ClientSDK aus referenzieren, daher besteht die logische Option darin, ein ähnliches Metrikobjekt im Frontend-SDK zu definieren.

Ich möchte keine CPU-Zyklen verschwenden, die Tausende von Metriken von einer Klassendefinition in eine andere kopieren.

Gibt es eine Möglichkeit anzugeben, welche Felder ich von der Back-End-Metrik für die Front-End-Definition von Metric verfügbar machen soll, während ich in JSON konvertiere? Besser noch, kann ich die Front-End-Definition auf den JSON-Konverter verweisen, wenn ich es ersuche, das Back-End-Objekt zu marshallen? Wir verwenden Jackson mit dem Spring-Rest-Framework für den Kontext, aber ich würde mich freuen, das sofort fallen zu lassen, da das Marshalling von Objekten über Annotationen die Ursache dieses Problems zu sein scheint.

Antwort

3

Werfen Sie einen Blick auf Jackson's JsonView Konstrukt.

class Views { 
    static class Client {} 
    static class Backend extends Client {} 
} 

public class Metric { 
    @JsonView(Views.Client.class) String metricName; 
    @JsonView(Views.Client.class) String count; 
    @JsonView(Views.Backend.class) String secretKey; 
} 

Die @JsonView Anmerkung wird unterstützt auf Frühling @ResponseBody kommentierten Methoden zum Spring 4.1:

Ich kann dein Beispiel suchen so etwas wie dies sehen.

+0

Es gibt auch eine '@ JsonIgnore' Anmerkung, die auf der genauen Einstellung des OP je könnte die einfachere Wahl sein. – ingenious

0

Wie Nicholas Hausschild vorgeschlagen hat, können Sie dies durch Anmerkungen mit Ihrem Marshalling/Unmarshalling Framework erreichen.

Allerdings können Sie einfach Vererbung und wie dieses Casting:

class SomeSuperClass { 
    String exposeThis; 
    String exposeThat; 
    // getters and setters... 
} 

class SomeSubClass extends SomeSuperClass { 
    String doNotExposeThis; 
    // getters and setters... 
} 

diese Weise können Sie auf der Superklasse werfen kann, wenn ein Objekt in den JSON-Parser zurückkehrt, und zugleich die Unterklasse verwenden intern trage zusätzliche Informationen bei, die du nicht wirklich darstellen willst.

0

Eine andere Möglichkeit ist die Verwendung von Mixins, so dass Sie verschiedene Szenarien definieren können, ohne das Original DTO zu berühren.

ich mir eine Bibliothek verwende ich diese dynamisch zu erreichen schrieb:

https://github.com/Antibrumm/jackson-antpathfilter

Das funktioniert gut für nicht zu tief Graphen, sonst jemand schrieb einen anderen Ansatz in ähnlicher Weise hier die für diese performanter scheint Szenarien, aber verhält sich ein bisschen anders.

https://github.com/krishna81m/jackson-nested-prop-filter

Verwandte Themen