JAX-RS'deki Sağlayıcı ne anlama geliyor?


110

Biri bana bir JAX-RS Sağlayıcısının ne olduğunu ve '@Provider' ek açıklamasının ne yaptığını açıklayabilir mi? Belgeleri okudum ama alamıyorum.
Gelen isteklere hizmet veren kaynak sınıfları varsa, Sağlayıcılar ne yapar? Kalıcı bir kaynak sınıfı oluşturduğumda (istek başına olmayan) tekli kaynak sınıflarından nasıl farklılar? Yoksa bu sınıflar da sağlayıcı mı?


Bununla birlikte gitmek için: JAX-RS belgesi bunu neden "Sağlayıcılar" bölümünün ilk paragrafında açıklamıyor - anlamak için baktığım mantıksal sayfa. JAX-RS Belgeleri PDF
Jonathan Komar

Yanıtlar:


138

Sağlayıcılar, JAX-RS çalışma zamanını genişletmenin ve özelleştirmenin basit bir yoludur. Bunları, bir dizi (program tanımlı) hedefi gerçekleştirmek için çalışma zamanının davranışını (potansiyel olarak) değiştiren eklentiler olarak düşünebilirsiniz.

Sağlayıcılar, kaynak sınıfları ile aynı değildir , kavramsal olarak, kaynak sınıfları ile JAX-RS uygulaması arasında bir seviyede bulunurlar. İşe yararsa, bunları aygıt sürücüleriyle aynı ışıkta düşünebilirsiniz (kullanıcı ve çekirdek alanı arasında var olan). Bu geniş bir genellemedir.

Mevcut JAX-RS spesifikasyonu ile tanımlanan üç sağlayıcı sınıfı vardır. Aralarındaki ortak nokta, tüm sağlayıcıların @Provider ek açıklamasıyla tanımlanması ve yapıcı bildirimi için belirli kurallara uyması gerektiğidir. Bunun dışında, farklı sağlayıcı türleri ek açıklamalara sahip olabilir ve farklı arabirimler uygulayacaktır.


Varlık Sağlayıcıları

Bu sağlayıcılar, veri temsillerinin (XML, JSON, CSV gibi) Java nesne eşdeğerleriyle eşleştirilmesini kontrol eder.

Bağlam Sağlayıcıları

Bu sağlayıcılar, kaynakların @Context ek açıklamaları aracılığıyla erişebileceği bağlamı kontrol eder.

İstisna Sağlayıcılar

Bu sağlayıcılar, Java istisnalarının bir JAX-RS Response örneğiyle eşlenmesini kontrol eder.


Çalışma zamanınız, temel bir işlevsellik düzeyinin uygulanmasından sorumlu olacak bir dizi önceden tanımlanmış sağlayıcıyla birlikte gelir (örneğin, XML'e ve XML'den eşleştirme, en yaygın istisnaları çevirme vb.). Gerektiğinde kendi sağlayıcılarınızı da oluşturabilirsiniz.

JAX-RS özellikleri bu farklı sağlayıcı türleri ve ne (Bölüm 4'e bakınız) do üzerinde okuma için iyi bir referanstır.


Teşekkürler. Sanırım bu şeyin fikrini aldım =)
Artem Moskalev

İyi açıkladı @ Algı. Bu gerçekten anlamama yardımcı oldu.
L-Samuels

İyi açıklanmış. Yine de bir soru - web.xml'deki init parametresi (jersey.config.server.provider.classnames) aracılığıyla enjekte edilen javax.ws.rs.core.Feature arabiriminin bir uygulamasından @provider uygulamaları nasıl farklıdır? Sipariş nasıl kontrol ediliyor?
Andy Dufresne

JAX-RS spesifikasyonunun en son sürümüne dikkat edin (Sürüm 2.1 Son Sürüm 13 Temmuz 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar

13

@Provider açıklama ilgilendiren olan şey için kullanılır Buy JAX-RS gibi MessageBodyReader ve MessageBodyWriter . HTTP istekleri için, MessageBodyReader, bir HTTP isteği varlık gövdesini yöntem parametrelerine eşlemek için kullanılır. Yanıt tarafında, bir MessageBodyWriter kullanılarak bir HTTP yanıt varlığı gövdesine bir dönüş değeri eşlenir. Uygulamanın HTTP üstbilgileri veya farklı bir durum kodu gibi ek meta veriler sağlaması gerekiyorsa, bir yöntem, varlığı saran ve Yanıt kullanılarak oluşturulabilen bir Yanıt döndürebilir. ResponseBuilder .

@Provider ek açıklaması, size gelen ve giden mesajları ham XML düzeyinde inceleme yeteneği sağlar ve bu şekilde Sağlayıcı, istemcideki Gönderimin karşılığıdır.


6

Filtreleme İsteği / Yanıt, İstisna İşleme gibi belirli etkinlikleri gerçekleştirmek için, JAX-RS kendi varsayılan uygulama mantığına sahiptir. Bununla birlikte, kullanıcıların kendi uygulamalarını da sağlamalarına izin verir.

Kendi uygulamamızı sağlamak için, uygun sınıfları @Provider ek açıklamasıyla belirterek uygulamamız gerekir.

JAX-RS, @Provider açıklamasını arayarak böyle bir kullanıcı tanımlı uygulamanın varlığını bulmak için bir tur tarama yapacaktır.

Örneğin:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.