2017-02-14 2 views
0

Я хотел бы перехватить запрос как до, так и после вызова клиента.Как подключить фильтр в CXF Jaxrs?

Дано:

Form formData = new Form(); 
    formData.param("grant_type", "client_credentials"); 

    List<Object> providers = new ArrayList(); 
    providers.add(new GsonMessageBodyProvider()); 
    providers.add(new RestLogger()); <--doesn't work 

    WebClient client = WebClient.create("https://blah.com", providers); 

    // sets timeouts. 
    HTTPConduit conduit = WebClient.getConfig(client).getHttpConduit(); 
    conduit.getClient().setReceiveTimeout(1000); 
    conduit.getClient().setConnectionTimeout(1000); 

    client.path("token.oauth2"); 
    client.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON); 

    WebClient wc = WebClient.fromClient(client);// thread safe 
    BearerTokenResponse r = wc.post(formData, BearerTokenResponse.class); 
    System.out.println(ToStringBuilder.reflectionToString(r)); 

Я написал класс, как это, что я думал, что будет работать:

public class RestLogger implements ContainerRequestFilter, ContainerResponseFilter { 
    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     System.out.println("request"); 
    } 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     System.out.println("response"); 

    } 
} 

Но это не срабатывает. Любая помощь? Я выполняю это в кластере Storm, поэтому я не могу использовать аннотации. Мне нужно связать это программно. Я использую 3.1.10 (новейший)

<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-rs-client --> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-rs-client</artifactId> 
     <version>3.1.10</version> 
    </dependency> 
+0

Сообщите мне, если мой [ответ] (http://stackoverflow.com/a/42378761/1426227) работает для вас. –

ответ

1

Для перехвата запросов и ответов на стороне клиента, используйте ClientRequestFilter и ClientResponseFilter.

Чтобы перехватить запросы и ответы на стороне сервера, используйте ContainerRequestFilter и ContainerResponseFilter.

+1

Это ответ. Конечно, я использовал неправильный интерфейс. Поднял его, и все работает отлично. В качестве примечания, интерфейс не находится в ProviderFactory, но, возможно, он удаляется из списка, прежде чем он туда попадет. Не уверен. Благодаря! – markthegrea

Смежные вопросы