在ClientRequestFilter中动态设置ClientRequestContext属性

时间:2019-01-23 14:52:32

标签: java jax-rs

大家好,我只想知道在jax-rs Web服务中使用ClientRequestFilter时如何将ClientRequestContext对象的属性设置为动态值。就是这样

假设我有一个对象

MyObject obj=new MyObject();
obj.nmae="simon";
obj.vendor=209;

现在我想调用一个为其创建球衣客户端并为其创建过滤器的Web服务。现在我想知道如何将对象传递给clientFilter,以便可以将ClientRequestContext属性设置为myObject ?

 @Provider
    public class RequestClientFilter implements ClientRequestFilter {

        @Override
        public void filter(ClientRequestContext requestContext) throws IOException {
            // how to set this to a variable value passed from a function in my code
            requestContext.setProperty("test", "test client request filter");
         //something along these lines
        requestContext.setProperty("myobj",obj);
        }
    }

这就是正在发生的事情

 MyObject obj=new MyObject();
    obj.nmae="simon";
    obj.vendor=209;
         ClientConfig config = new ClientConfig();
            config.register(EntityLoggingFilter.class);
            config.register(GsonMessageBodyHandler.class);
            config.register(ClFilter.class);
            // config.property(ClientProperties.CONNECT_TIMEOUT, 1000);
            config.property(ClientProperties.READ_TIMEOUT, 10000);

            try {
                Client client = ClientBuilder.newClient(config);
                WebTarget webTarget = client.target("http://localhost:8081/ServicB").path("Register")
                        .path("Service");
                System.out.println(webTarget.getUri());
                Invocation.Builder invocationBuilder = webTarget.request().accept(MediaType.APPLICATION_JSON);
                Response response = invocationBuilder.post(Entity.json("anything"));
                System.out.println(response.getStatus());
                String bresponse = response.readEntity(String.class);
                if (bresponse == null) {
                    System.out.println("null response");
                }
                System.out.println(bresponse);

            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }

1 个答案:

答案 0 :(得分:1)

您可以将过滤器注册为类或实例。如果MyObject只是一次性对象,则只需将对象通过过滤器的构造函数,然后注册它即可。

config.register(new RequestClientFilter(myObject));

如果MyObject将针对每个请求进行更改,那么您也可以改为使用WebTarget注册过滤器。因此,对于每个不同的请求,您可以使用不同的对象。

Response response1 = client.target(uri)
    .register(new RequestClientFilter(myObjectOne))
    .request()
    .get();
Response response2 = client.target(uri)
    .register(new RequestClientFilter(myObjectTwo))
    .request()
    .get();