Co oznacza Provider w JAX-RS?

110

Czy ktoś mógłby mi wyjaśnić, czym jest dostawca JAX-RS i co robi adnotacja „@Provider”? Czytałem dokumentację, ale nie mogę jej zrozumieć.
Jeśli istnieją klasy zasobów obsługujące żądania przychodzące, co robią dostawcy? Czym różnią się one od pojedynczych klas zasobów, gdy tworzę trwałą klasę zasobów (taką, która nie jest na żądanie)? A może te zajęcia są również dostawcami?

Artem Moskalev
źródło
Aby się z tym zgodzić: Dlaczego dokument JAX-RS nie wyjaśnia tego w pierwszym akapicie rozdziału „Dostawcy” - logicznej stronie, do której sięgnąłem, szukając zrozumienia. Dokumentacja JAX-RS PDF
Jonathan Komar

Odpowiedzi:

138

Dostawcy są prostym sposobem na rozszerzenie i dostosowanie środowiska wykonawczego JAX-RS. Możesz myśleć o nich jako o wtyczkach, które (potencjalnie) zmieniają zachowanie środowiska wykonawczego, aby osiągnąć zestaw (zdefiniowanych przez program) celów.

Dostawcy nie tym samym, co klasy zasobów, istnieją koncepcyjnie na poziomie pomiędzy klasami zasobów a implementacją JAX-RS. Jeśli to pomoże, możesz myśleć o nich w tym samym świetle, co o sterownikach urządzeń (istniejących między przestrzenią użytkownika a jądrem). To szerokie uogólnienie.

Istnieją trzy klasy dostawców zdefiniowane w aktualnej specyfikacji JAX-RS. Wspólną cechą między nimi jest to, że wszyscy dostawcy muszą być identyfikowani przez adnotację @Provider i przestrzegać pewnych zasad dotyczących deklaracji konstruktora. Poza tym różne typy dostawców mogą mieć dodatkowe adnotacje i będą implementować różne interfejsy.


Dostawcy jednostek

Dostawcy ci sterują mapowaniem reprezentacji danych (takich jak XML, JSON, CSV) na ich odpowiedniki obiektów Java.

Dostawcy kontekstu

Ci dostawcy kontrolują kontekst, do którego zasoby mają dostęp za pośrednictwem adnotacji @Context.

Dostawcy wyjątków

Dostawcy ci sterują mapowaniem wyjątków języka Java na instancję odpowiedzi JAX-RS.


Twoje środowisko uruchomieniowe będzie dostarczane z wieloma predefiniowanymi dostawcami, którzy będą odpowiedzialni za implementację podstawowego poziomu funkcjonalności (np. Za mapowanie do iz XML, tłumaczenie najczęstszych wyjątków itp.). W razie potrzeby możesz również utworzyć własnych dostawców.

Specyfikacja JAX-RS jest dobrym źródłem informacji na temat różnych typów dostawców i tego, co robią (patrz Rozdział 4).

Postrzeganie
źródło
Dzięki. Myślę, że wpadłem na pomysł =)
Artem Moskalev
Dobrze wyjaśnione @Perception. To naprawdę pomogło mi w zrozumieniu.
L-Samuels
Dobrze wyjaśnione. Jednak jedno pytanie - czym różnią się implementacje @provider od implementacji interfejsu javax.ws.rs.core.Feature wprowadzonego przez parametr init (jersey.config.server.provider.classnames) w web.xml? Jak kontrolowane jest zamówienie?
Andy Dufresne
Zwróć uwagę na najnowszą wersję specyfikacji JAX-RS (wersja 2.1 Final Release 13 lipca 2017 r.) Download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

@Provider adnotacji służy do niczego, co jest interesujące dla JAX-RS Runtime , takich jak MessageBodyReader i MessageBodyWriter . W przypadku żądań HTTP MessageBodyReader służy do mapowania treści jednostki żądania HTTP na parametry metody. Po stronie odpowiedzi wartość zwracana jest mapowana na treść jednostki odpowiedzi HTTP przy użyciu MessageBodyWriter. Jeśli aplikacja musi dostarczyć dodatkowe metadane, takie jak nagłówki HTTP lub inny kod stanu, metoda może zwrócić Response, która otacza jednostkę i którą można zbudować za pomocą Response. ResponseBuilder .

Adnotacja @Provider daje możliwość badania przychodzących i wychodzących wiadomości na surowym poziomie XML iw ten sposób Provider jest odpowiednikiem Dispatch na kliencie.

SZEF
źródło
6

Do wykonywania pewnych czynności, takich jak filtrowanie żądania / odpowiedzi, obsługa wyjątków, JAX-RS ma własną domyślną logikę implementacji. Jednak pozwala użytkownikom na dostarczenie własnej implementacji.

Aby zapewnić własną implementację, musimy zaimplementować odpowiednie klasy, określając je za pomocą adnotacji @Provider.

JAX-RS przeprowadzi rundę skanowania, aby znaleźć istnienie dowolnej takiej zdefiniowanej przez użytkownika implementacji, wyszukując adnotację @Provider.

Na przykład:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
maris
źródło