Wie Java Primitive mit Jersey REST serialisiert werden

8

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?

    
Olvagor 13.04.2010, 12:40
quelle

6 Antworten

4

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.

    
mvlupan 03.02.2013 10:00
quelle
3

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?

3.6. Unterstützung für neue Darstellungen hinzufügen

    
Nick Klauer 29.04.2010 03:12
quelle
2

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.

    
Alex Winston 20.05.2010 21:21
quelle
2

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

  • Null- oder Einzelelement-Listenarrays werden immer als json-Array ([] -Feld)
  • geschrieben
  • Primitive Ganzzahlen und boolesche Felder werden als json-Primitive (ohne Anführungszeichen)
  • geschrieben

Ich benutze die folgende Umgebung

  • Sun Java JDK1.6.x
  • Apache Tomcat 6.x
  • Jersey v1.14 Bibliotheken (jersey-archive-1.14.zip)
  • Der Ordner
  • webapps / myapp / WEB-INF / lib enthält die Dateien asm-3.3.1.jar, jackson-core-asl.jar, jersey-client.jar, jersey-core.jar, jersey-json.jar, jersey- server.jar, jersey-servlet.jar Bibliotheken
  • füge optional annotation-detector.jar hinzu, wenn du das infomas-asl discovery tool
  • benutzt

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.

Ссылка

    
Whome 27.09.2012 14:49
quelle
2

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.

  1. Leere Listen werden als [] (fast unmöglich)
  2. gerendert
  3. Eine Elementliste wird als [] (schwierige, aber nur Zuordnungskonfiguration)
  4. gerendert
  5. Viele Elementlisten werden als [] (easy)
  6. gerendert

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%     
Frank Ittermann 08.01.2016 19:52
quelle
2

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?

    
zakmck 07.10.2013 17:09
quelle