In meiner Anwendung verwende ich Jersey REST, um komplexe Objekte zu serialisieren. Das funktioniert ganz gut. Aber es gibt ein paar Methoden, die einfach ein int oder boolean zurückgeben.
Jersey kann mit primitiven Typen (meines Wissens) nicht umgehen, wahrscheinlich weil sie nicht kommentiert sind und Jersey keine Standardannotation für sie hat. Ich habe daran gearbeitet, indem ich komplexe Typen wie einen RestBoolean oder RestInteger erstellt habe, die einfach einen int oder booleschen Wert enthalten und die entsprechenden Anmerkungen haben.
Gibt es keinen einfacheren Weg als diese Containerobjekte zu schreiben?
Sehen Sie sich Genson an. Es hat mir sehr bei einem ähnlichen Problem geholfen. Mit Genson könnten Sie Generika wie int verwenden, Boolean, Listen und so weiter ... Hier ist ein kurzes Beispiel.
%Vor%Dies erzeugt einen gültigen JSON, der sehr einfach wie folgt abgerufen werden kann:
%Vor%Sie werden sehen, dass Genson Ihnen helfen wird, das JSON auf der Client-Seite zu dekodieren und die korrekte Klasse für jedes auszugeben.
Schreiben Sie einen Service oder einen Kunden? Im Service-End der Dinge schreiben Sie einfach einen MessageBodyWriter , um einen Datenstrom zu einem Java-Objekt für Ihre Typen zu serialisieren. In meinen Anwendungsfällen schreibe ich die Dienste, die ich schreibe, nach JSON oder XML, und im Falle von XML werfe ich einfach eine JAXB-Anmerkung über meine Klassen und ich bin fertig.
Haben Sie sich diesbezüglich die Jersey Bedienungsanleitung angesehen?
Eigentlich ist Ihre beste Wette, einen benutzerdefinierten ContextResolver-Provider wie den folgenden zu schreiben, der natürliche Erstellung von JSON.
%Vor%Das einzige, was hier besonders auffällt, ist die YourSpecialBean.class in der Klasse []. Dies definiert ein Array von Klassentypen, die dieser Anbieter natürlich auflösen wird.
Sagen Sie Jersey, dass Sie die richtigen JSON-Dokumente generieren (Natural JSON). Ich benutze dieselbe Klasse für Rest-App und JAXBContext-Resolver, fand es die sauberste Kapselung.
Bessere Programmierer können Helfer implementieren, um .class-Dateien zu iterieren und entsprechende Klassen automatisch aufzulisten, indem sie @Annotation-Tags identifizieren. Ich weiß nicht, wie man es in einem eigenen Quellcode rennt.
Diese beiden Links waren hilfreich, um diesen zusätzlichen Java-Jargon zu studieren. Ich weiß nicht, warum es keinen Jersey-Parameter gibt, um alles aus der Box zu machen.
WEB-INF / web.xml (Schnipsel):
%Vor%com.myapp.rest.RESTApplication.java
%Vor%Die Klassen MyBean1, MyBean2 sind einfache Java-Objekte und die MyBeansResource-Klasse ist die Klasse mit @Path-Restfunktionen. Es gibt nichts Besonderes in ihnen erwarten Standard-jaxp @Annotations hier und dort. Nach diesem Java-Jargon haben JSON-Dokumente
Ich benutze die folgende Umgebung
jersey-archive.zip hatte eine ältere asm-3.1.jar-Datei, funktioniert wahrscheinlich gut, aber chapter_deps.html verweist auf eine neuere Datei. Siehe Linkliste oben.
Bearbeiten Ich habe ein exzellentes (schnelles, leichtes, nur 15KB) Annotation Discovery Tool gefunden. In diesem Beitrag erfahren Sie, wie ich Typen zur Laufzeit automatisch erkenne und nicht mehr jedes Mal, wenn eine neue Java-Bean (jaxb) hinzugefügt wird, RESTApplication bearbeiten muss.
Ich hatte heute das gleiche Problem und gab nicht auf, bis ich eine wirklich gute Lösung gefunden hatte. Ich kann die Jersey-Bibliothek von 1.1.5 nicht aktualisieren es ist ein Legacy-System. Mein Ruheservice gibt eine Liste zurück, und sie sollten diesen Regeln folgen.
Start von einfach bis unmöglich.
3) nichts heute normales JSON Mapping
2) Registrieren Sie JAXBContextResolver wie folgt
%Vor%1) Der folgende Ansatz funktioniert nur für Collections $ EmptyList-Klasse. Können Sie einen Weg finden, um es für alle Sammlungen, die leer sind, allgemein zu machen? Kann Code mit EmptyList so umgehen.
%Vor%Ich habe gerade entdeckt, dass die Rückgabe eines primitiven Typs mit Jersey problematisch ist. Ich habe mich entschieden, String stattdessen zurückzugeben. Vielleicht ist das nicht sauber, aber ich denke nicht, dass es zu schmutzig ist. Der Java-Client, der meistens von demselben Autor des Servers geschrieben wird, kann einen solchen String-Rückgabewert umbrechen und ihn wieder in int konvertieren. Clients, die in anderen Sprachen geschrieben werden, müssen Rückgabetypen auf jede Art kennen.
Definieren RestInteger, RestBoolean kann eine andere Option sein, aber es ist mühsamer und ich sehe zu wenig Vorteil darin, attraktiv zu sein.
Oder fehlt mir hier etwas Wichtiges?
Tags und Links java rest serialization jersey primitive