在 ClientRequestFilter 中动态设置 ClientRequestContext 属性

set ClientRequestContext property dynamically in ClientRequestFilter

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

假设我有一个对象

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

现在我想调用一个 Web 服务,我为其创建了一个球衣客户端,并为该客户端创建了 filter.Now 我想知道如何将我的对象传递给 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());
            }

您可以将过滤器注册为 class 或实例。如果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();