it-swarm.com.de

Was bedeutet Provider in JAX-RS?

Kann mir jemand erklären, was ein JAX-RS-Anbieter ist und was die Anmerkung "@Provider" bewirkt? Ich habe Dokumentation gelesen, aber ich kann es nicht bekommen.
Was tun Anbieter, wenn es Ressourcenklassen gibt, die die eingehenden Anforderungen bedienen? Inwiefern unterscheiden sie sich von Singleton-Ressourcenklassen, wenn ich eine persistente Ressourcenklasse erstelle (die nicht pro Anforderung ist)? Oder sind diese Klassen auch Anbieter?

92
Artem Moskalev

Provider sind eine einfache Möglichkeit, die JAX-RS-Laufzeit zu erweitern und anzupassen. Sie können sich Plugins vorstellen, die (möglicherweise) das Verhalten der Laufzeit ändern, um eine Reihe von (programmdefinierten) Zielen zu erreichen.

Provider sind nicht dieselben wie Ressourcenklassen. Sie existieren konzeptionell auf einer Ebene zwischen den Ressourcenklassen und die JAX-RS-Implementierung. Wenn es hilft, können Sie sie im selben Licht wie Gerätetreiber (zwischen Benutzer- und Kernel-Space vorhanden) betrachten. Dies ist eine breite Verallgemeinerung.

Es gibt drei Anbieterklassen, die in der aktuellen JAX-RS-Spezifikation definiert sind. Die Gemeinsamkeit besteht darin, dass alle Anbieter durch die @ Provider-Annotation 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 Provider steuern die Zuordnung von Java Exceptions zu einer JAX-RS Response-Instanz.


Ihre Laufzeitumgebung 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 eigene Anbieter erstellen.

Die JAX-RS-Spezifikation ist eine gute Referenz, um sich über diese verschiedenen Anbietertypen und deren Funktionsweise zu informieren (siehe Kapitel 4).

117
Perception

Die Annotation @ Provider wird für alle Elemente verwendet, die für die JAX-RS-Laufzeit von Interesse sind, z. B. MessageBodyReader und MessageBodyWriter. Bei HTTP-Anforderungen wird der MessageBodyReader verwendet, um einen HTTP-Anforderungsentitätskörper Methodenparametern zuzuordnen. Auf der Antwortseite wird ein Rückgabewert mithilfe eines MessageBodyWriter einem HTTP-Antwortentitätshauptteil 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 Response erstellt werden kann. ResponseBuilder.

@ Provider Mit der Annotation können Sie eingehende und ausgehende Nachrichten auf der unformatierten XML-Ebene untersuchen. Auf diese Weise ist der Provider das Gegenstück zum Versand auf dem Client.

9
A_BOSS

Für bestimmte Aktivitäten wie Filteranforderung/-antwort, Ausnahmebehandlung verfügt der JAX-RS über eine eigene Standardimplementierungslogik. Benutzer können jedoch auch ihre eigene Implementierung bereitstellen.

Um unsere eigene Implementierung bereitzustellen, müssen wir die entsprechenden Klassen implementieren, indem wir sie mit @Provider-Annotation angeben.

JAX-RS führt eine Scan-Runde durch, um die Existenz einer solchen benutzerdefinierten Implementierung zu ermitteln, indem nach @Provider-Annotationen gesucht wird.

Beispielsweise:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
3
maris