Kann mir jemand erklären, was ein JAX-RS-Anbieter ist und was die Annotation '@Provider' bewirkt? Ich habe Dokumentation gelesen, kann sie aber nicht verstehen.
Was tun Anbieter, wenn es Ressourcenklassen gibt, die die eingehenden Anforderungen bedienen? Wie unterscheiden sie sich von Singleton-Ressourcenklassen, wenn ich eine persistente Ressourcenklasse erstelle (die nicht pro Anforderung ist)? Oder sind diese Klassen auch Anbieter?
110
Antworten:
Anbieter sind einfach eine Möglichkeit, die JAX-RS-Laufzeit zu erweitern und anzupassen. Sie können sich diese als Plugins vorstellen, die (möglicherweise) das Verhalten der Laufzeit ändern, um eine Reihe von (programmdefinierten) Zielen zu erreichen.
Anbieter sind nicht mit Ressourcenklassen identisch, sie existieren konzeptionell auf einer Ebene zwischen Ressourcenklassen und der JAX-RS-Implementierung. Wenn es hilft, können Sie sie im selben Licht wie Gerätetreiber betrachten (zwischen Benutzer und Kernel-Speicher vorhanden). Dies ist eine breite Verallgemeinerung.
Es gibt drei Klassen von Anbietern, die in der aktuellen JAX-RS-Spezifikation definiert sind. Die Gemeinsamkeit zwischen ihnen besteht darin, dass alle Anbieter durch die Annotation @Provider identifiziert werden müssen und bestimmte Regeln für die Konstruktordeklaration befolgen müssen. Abgesehen davon können verschiedene Anbietertypen zusätzliche Anmerkungen enthalten und unterschiedliche Schnittstellen implementieren.
Entitätsanbieter
Diese Anbieter steuern die Zuordnung von Datendarstellungen (wie XML, JSON, CSV) zu ihren Java-Objektäquivalenten.
Kontextanbieter
Diese Anbieter steuern den Kontext, auf den Ressourcen über @ Context-Annotationen zugreifen können.
Ausnahmeanbieter
Diese Anbieter steuern die Zuordnung von Java-Ausnahmen zu einer JAX-RS-Antwortinstanz.
Ihre Laufzeit wird mit einer Reihe vordefinierter Anbieter geliefert, die für die Implementierung einer Basisfunktionalitätsebene verantwortlich sind (z. B. für die Zuordnung zu und von XML, die Übersetzung der häufigsten Ausnahmen usw. usw.). Sie können bei Bedarf auch Ihre eigenen Anbieter erstellen.
Die JAX-RS-Spezifikation ist eine gute Referenz, um sich über diese verschiedenen Anbietertypen und deren Funktionsweise zu informieren (siehe Kapitel 4).
quelle
Die Annotation @Provider wird für alles verwendet, was für die JAX-RS-Laufzeit von Interesse ist , z. B. MessageBodyReader und MessageBodyWriter . Bei HTTP-Anforderungen wird der MessageBodyReader verwendet, um einen HTTP-Anforderungsentitätstext Methodenparametern zuzuordnen. Auf der Antwortseite wird ein Rückgabewert mithilfe eines MessageBodyWriter einem HTTP-Antwortentitätstext zugeordnet. Wenn die Anwendung zusätzliche Metadaten wie HTTP-Header oder einen anderen Statuscode bereitstellen muss, kann eine Methode eine Antwort zurückgeben, die die Entität umschließt und mit Antwort erstellt werden kann. ResponseBuilder .
Mit der @ Provider- Annotation können Sie eingehende und ausgehende Nachrichten auf XML-Rohdatenebene untersuchen. Auf diese Weise ist der Provider das Gegenstück zum Versand auf dem Client.
quelle
Für bestimmte Aktivitäten wie Filtering-Request / Response, Exception Handling verfügt der JAX-RS über eine eigene Standardimplementierungslogik. Es ermöglicht Benutzern jedoch auch, ihre eigene Implementierung bereitzustellen.
Um unsere eigene Implementierung bereitzustellen, müssen wir die entsprechenden Klassen implementieren, indem wir sie mit der Annotation @Provider angeben.
JAX-RS führt eine Scan-Runde durch, um festzustellen, ob eine solche benutzerdefinierte Implementierung vorhanden ist, indem nach @ Provider-Anmerkungen gesucht wird.
Beispielsweise:
quelle