Was bedeutet Provider in JAX-RS?

110

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?

Artem Moskalev
quelle
Dazu: Warum erklärt das JAX-RS-Dokument dies nicht im ersten Absatz des Kapitels "Anbieter" - der logischen Seite, auf die ich mich bei der Suche nach Verständnis gewandt habe. JAX-RS Dokumentation PDF
Jonathan Komar

Antworten:

138

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).

Wahrnehmung
quelle
Vielen Dank. Ich glaube, ich habe die Idee von der Sache =)
Artem Moskalev
Gut erklärt @Perception. Das hat mir sehr geholfen.
L-Samuels
Gut erklärt. Eine Frage: Wie unterscheiden sich @ provider-Implementierungen von einer Implementierung der Schnittstelle javax.ws.rs.core.Feature, die über den init-Parameter (jersey.config.server.provider.classnames) in web.xml injiziert wird? Wie wird die Bestellung gesteuert?
Andy Dufresne
Beachten Sie die neueste Version der JAX-RS-Spezifikation (Version 2.1 Final Release 13. Juli 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

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.

EIN CHEF
quelle
6

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:

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
Maris
quelle