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?
110
Odpowiedzi:
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 są 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).
źródło
@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.
źródło
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:
źródło