2012-07-06 23 views
8

RestEasy 2.3.4.Final'den yararlanarak bir REST API'si yazıyorum. Bir Interceptor'un tüm isteklerimi keseceğini ve bir PreProcessInterceptor'un çağrılacak ilk (her şeyden önce) olacağını biliyorum. Bu Interceptor'un sadece belirli yöntemler çağrıldığında nasıl çağrılacağını nasıl bilmek isterim.RESTEasy PreProcessInterceptor yalnızca belirli yöntemlerde nasıl kullanılır?

Hem PreProcessInterceptor hem de AcceptedByMethod kullanmayı denedim, ancak ihtiyacım olan parametreleri okuyamadı. Örneğin, ben bu yöntemi denir yalnızca benim Interceptor çalıştırmak gerekir:

@GET 
@Produces("application/json;charset=UTF8") 
@Interceptors(MyInterceptor.class) 
public List<City> listByName(@QueryParam("name") String name) {...} 

daha spesifik olmak gerekirse, ben kimin onun imzasına bir @QueryParam("name")

olan tüm yöntemlerde benim Interceptor çalıştırmak için gereken, Böylece ismini alıp her şeyden önce bir şeyler yapabilirim.

Mümkün mü? Interceptor'da "isim" parametresini yakalamaya çalıştım ama bunu yapamadım.

Birisi bana yardım edebilir mi lütfen? RESTEasy documentation

açıklandığı gibi

cevap

7

Sen PreProcessInterceptor ve AcceptedByMethod hem uygulamak bir sınıf oluşturun AcceptedByMethod kullanabilirsiniz. accept-yönteminde, yöntemin @QueryParam("name") ile açıklamalı bir parametresi olup olmadığını kontrol edebilirsiniz. Yöntem bu açıklamaya sahipse, accept-yönteminden döndürün.

preProcess-yönteminde sorgu parametresini request.getUri().getQueryParameters().getFirst("name")'dan alabilirsiniz. Eğer son noktayı kaybedecek return new ServerResponse(responseText, 200, new Headers<Object>()); dönerseniz

public class InterceptorTest { 

    @Path("/") 
    public static class MyService { 

     @GET 
     public String listByName(@QueryParam("name") String name){ 
      return "not-intercepted-" + name; 
     } 
    } 

    public static class MyInterceptor implements PreProcessInterceptor, AcceptedByMethod { 

     @Override 
     public boolean accept(Class declaring, Method method) { 
      for (Annotation[] annotations : method.getParameterAnnotations()) { 
       for (Annotation annotation : annotations) { 
        if(annotation.annotationType() == QueryParam.class){ 
         QueryParam queryParam = (QueryParam) annotation; 
         return queryParam.value().equals("name"); 
        } 
       } 
      } 
      return false; 
     } 

     @Override 
     public ServerResponse preProcess(HttpRequest request, ResourceMethod method) 
       throws Failure, WebApplicationException { 

      String responseText = "intercepted-" + request.getUri().getQueryParameters().getFirst("name"); 
      return new ServerResponse(responseText, 200, new Headers<Object>()); 
     } 
    } 

    @Test 
    public void test() throws Exception { 
     Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); 
     dispatcher.getProviderFactory().getServerPreProcessInterceptorRegistry().register(new MyInterceptor()); 
     dispatcher.getRegistry().addSingletonResource(new MyService()); 

     MockHttpRequest request = MockHttpRequest.get("/?name=xxx"); 
     MockHttpResponse response = new MockHttpResponse(); 

     dispatcher.invoke(request, response); 

     assertEquals("intercepted-xxx", response.getContentAsString()); 
    } 
} 
+0

Thankyou @eiden. Bunu daha önce denedim, ama 'Context' kullanmadan. Ancak, enjekte edilen içerikten bazı verileri almaya çalıştığımda, bağlamın başlatılmadığı için bir Özel Durum atar. org.apache.catalina.core.ContainerBase. [Jboss.web]. [Varsayılan-ana bilgisayar]. [/ Api]] (MSC hizmeti iş parçacığı 1-3) Özel durum gönderme olayı, org.jboss sınıfının dinleyici örneğine başlatıldı .resteasy.plugins.server.servlet.ResteasyBootstrap: org.jboss.resteasy.spi.LoggableFailure: Bağlamsal veri türü bulunamadı: javax.servlet.http.HttpServletRequest – pulu

+0

Neden @Context kullanıyorsunuz bilmiyorum? Her neyse, cevabımı – eiden

+0

Excelent @eiden kod örneği ile güncelleştirdim. Neredeyse bu şekilde çalıştım, ama ben (annotation.annotationType() == QueryParam.class) { QueryParam queryParam = (QueryParam) ek açıklamasını gerçekleştirmedim; return queryParam.value(). Eşittir ("ad"); Çok Bana yardım ettiğin için teşekkürler! Ve umarım biraz daha insanlara yardımcı olur. – pulu

2

:

DÜZENLEME: İşte

bir örnektir. İletinin son noktaya iletilmesini istiyorsanız, null'u geri göndermeniz gerekir.

İlgili konular