Jersey Json und Pojo

8

Ich habe viel zu viele Stunden (mehr als 10, würde ich sagen) versucht, herauszufinden, wie man grundlegende json-Anrufe (von angularjs) bekommt, um auf meinem Jersey 2.4 zu öffnen und zu verarbeiten. Ich habe jedes mögliche Ergebnis bei Google ausprobiert und bekomme immer noch ein

  

415 (Nicht unterstützter Medientyp)

Clientseite und ein

  

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader nicht gefunden für Medientyp = application / json, type = class jersey.webreatability.controllers.jsonmodels.TextInput, genericType = class jersey.webecable.controllers.jsonmodels. TextInput.

auf der Serverseite.

Ich schreibe hier jede mögliche Datei, die ich geändert habe, während ich versuche, das zu lösen, in der Hoffnung, dass es mir helfen wird. Im Moment ist es mir nicht wirklich wichtig, wie es funktionieren wird, solange es funktioniert, ich verstehe, wer das ist, ich sollte wahrscheinlich das mit Jackson oder Gson arbeiten lassen.

Abhängigkeiten (von der POM-Datei):

%Vor%

aus der Web.xml:

%Vor%

Die Objektklasse:

%Vor%

Hauptklasse:

%Vor%

und js:

%Vor%

Das ist alles was ich momentan habe, ich hoffe es hilft.

Vielen Dank.

    
Ido_f 14.11.2013, 00:40
quelle

3 Antworten

11

Ich füge das als meine eigene Antwort hinzu, weil ich denke, dass dies jemandem mit einer schrecklichen Arbeitskopie von Jersey in der Zukunft helfen wird. Zur gleichen Zeit war die Antwort von @Michal Gajdos sehr hilfreich und Sie sollten sich auch auf seinen Text beziehen, wenn Sie in der Zukunft Probleme haben.

Was mir schließlich geholfen hat, war eine Abhängigkeit, die so ziemlich alles beinhaltet, was Sie brauchen. füge es einfach hinzu und probiere es aus

%Vor%

Quelle: Git

    
Ido_f 14.11.2013, 18:12
quelle
8

Abhängigkeiten

Entfernen Sie sowohl jersey-media-json (dieses Modul existiert nicht mehr in Jersey 2.x) als auch jersey-json (was nur für Jersey 1.x gilt) und fügen Sie eines der Module jersey-media-moxy (JAXB) oder hinzu jersey-media-json-jackson (POJO). Weitere Informationen zu diesen Modulen finden Sie im JSON-Kapitel im Jersey-Benutzerhandbuch.

web.xml

Entfernen Sie com.sun.jersey.config.property.packages und com.sun.jersey.api.json.POJOMappingFeature , die spezifisch für Jersey 1.x sind und in Jersey 2.x nicht verwendet werden. Der erste wurde durch jersey.config.server.provider.packages ersetzt und der zweite wurde entfernt (um POJO JSON & lt; - & gt; Objekt-Mapping zu verwenden, verwenden Sie das Jackson Modul jersey-media-json-jackson ).

Funktionen registrieren

Wenn Sie jersey-media-json-jackson module verwenden, müssen Sie sich registrieren JacksonFeature in einer Erweiterung der JAX-RS-Anwendung oder in web.xml (mit Eigenschaften von ServerProperties ) - siehe Kapitel Jackson . MOXy ( jersey-media-moxy ) wird automatisch registriert, wenn sich das Modul im Klassenpfad befindet.

    
Michal Gajdos 14.11.2013 09:50
quelle
2

Aktivieren Sie JacksonFeature in web.xml. Siehe auch ServerProperties

> %Vor%     
Ben Asmussen 09.04.2015 22:17
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset Wie funktioniert iter ()? ___ antwort19854410 ___

Von %code% help:

  

iter (...)
      iter (Sammlung) - & gt; Iterator
      iter (aufrufbar, Sentinel) - & gt; Iterator

%Vor%

Sie mischen zwei Varianten von %code% function. Der erste akzeptiert Sammlungen, der zweite akzeptiert zwei Argumente - Funktion und Sentinel-Wert. Sie versuchen, den und Sentinel-Wert zu übergeben, was falsch ist.

Kurzer Hinweis: Sie können eine Menge interessanter Informationen von Pythons eingebauter %code% -Funktion erhalten. Geben Sie einfach die Python-Konsole %code% ein und Sie erhalten eine Dokumentation darüber.

  

Warum gibt callabe (list) true zurück, aber callable (l) nicht?

Weil %code% eine Funktion ist, die ein neues Listenobjekt zurückgibt. Funktion ist aufrufbar (das ist was Funktion tut - es wird aufgerufen), während Instanz, die diese Funktion zurückgibt - neues Listenobjekt - nicht ist.

    
___ answer19854647 ___

Wenn %code% mit zwei Argumenten aufgerufen wird, verwendet %code% einen Callable- und einen Sentinel-Wert. Das Verhalten ist so, wie es implementiert wurde:

%Vor%

Was als %code% übergeben wird, muss aufrufbar sein , was bedeutet, dass Sie es einfach wie eine Funktion aufrufen können. Das %code% builtin ist ein %code% -Objekt, mit dem Sie neue Listeninstanzen erstellen können, indem Sie es wie eine Funktion aufrufen:

%Vor%

Die Liste %code% , die Sie übergeben haben, ist eine vorhandene Listeninstanz, die nicht wie eine Funktion verwendet werden kann:

%Vor%

Somit gibt es einen großen und wichtigen Unterschied zwischen dem Objekt %code% type und den Listeninstanzen, der bei Verwendung mit %code% angezeigt wird.

Um eine Liste zu durchlaufen, bis ein Sentinel erreicht ist, können Sie %code% :

verwenden %Vor%     
___ qstntxt ___

Was ist das Problem mit diesem Code

? %Vor%

Es gibt

zurück %Vor%

Warum gibt callabe (list) true zurück, aber kann aufgerufen werden (l) nicht?

BEARBEITEN Welche Methode sollte hier bevorzugt werden?

  1. manuelle Pausen
  2. hundert andere

Vielen Dank im Voraus

    
___ answer19854409 ___

Es hat damit zu tun, dass der zweite Wert übergeben wird (ein sogenannter Sentinel-Wert), dies stellt sicher, dass das Objekt, über das iteriert wird, ein aufrufbares ie ist. eine Funktion. Also ruft %code% für jede Iteration %code% für das übergebene Objekt auf.

%code% hat zwei verschiedene Verhaltensweisen,

  • ohne einen Sentinel-Wert
  • mit einem Sentinel-Wert

Das Beispiel in der Dokumentation ist großartig, um es zu verstehen

%Vor%     
___ answer19854402 ___

Sehen Sie sich die Dokumentation Ссылка

an

Wenn das zweite Argument in %code% vorhanden ist, wird das erste Argument sehr unterschiedlich behandelt. Es soll eine Funktion sein, die in jedem Schritt aufgerufen wird. Wenn sie Sentinel zurückgibt (d. H. Das zweite Argument), stoppt die Iteration. Zum Beispiel:

%Vor%

BEARBEITEN: Wenn Sie nur eine Liste durchlaufen und anhalten wollen, wenn Sie einen Sentinel sehen, dann empfehle ich einfach folgendes:

%Vor%     
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123python3x ___ Python 3 ist die neueste Version der Python-Programmiersprache und wurde am 3. Dezember 2008 offiziell veröffentlicht. Verwenden Sie das allgemeinere [python] -Tag, wenn Ihre Frage nicht versionsspezifisch ist. ___ answer19854684 ___

Denken Sie daran, dass Klassen Objekte in Python sind.

%Vor%

Bedeutet, dass sich selbst auflisten ist aufrufbar, anstatt dass es aufrufbar ist. Wie Sie gesehen haben, sind sie nicht:

%Vor%

Tatsächlich sind alle Klassen in Python aufrufbar - wenn sie keine Literale wie %code% haben, ist dies die übliche Art, sie zu instanziieren. Überlegen Sie:

%Vor%

Die letzte Zeile ruft das %code% -Klassenobjekt auf, das eine Instanz erstellt - also muss %code% aufrufbar sein. Aber Sie würden nicht erwarten, dass -Instanz aufrufbar ist, da %code% selbst kein %code% definiert.

Andererseits ist die Klasse von %code% (dh ihre Metaklasse, %code% ) :

%Vor%

was macht %code% aufrufbar.

    
___ answer19854355 ___
  

Warum gibt callabe (list) true zurück, aber callable (l) nicht?

Weil %code% eine eingebaute Python-Funktion ist, während %code% eine Liste ist.

    
___