可以在RestEasy中注册一个适用于任何实例的过滤器吗?今天我有很多服务使用一个客户端
例如:
Client client = ClientBuilder.newClient();
WebTarget target = client.target(ulrBase);
ResteasyWebTarget rtarget = (ResteasyWebTarget) target;
this.servico = rtarget.proxy(UsuarioServiceClient.class);
但现在我必须传递一个标题道具,所以我创建了这个:
public class AuthHeadersRequestFilter实现ClientRequestFilter {
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("xx-Authorization", ((IntegraUI) UI.getCurrent()).getSessionToken());
}
}
但对于所有客户端我需要插入此行:
client.register(new AuthHeadersRequestFilter());
那么,我可以配置到我创建一个客户端的每个地方,这个过滤器会自动注册吗?
TKS
答案 0 :(得分:0)
你在玩多少Client
个实例?
Client
个实例是重量级对象,您应该只有少量个实例,并在可能的情况下重用它们。看看documentation:
Client
是管理客户端通信基础设施的重量级对象。初始化以及Client
实例的处置可能是相当昂贵的操作。因此,建议在应用程序中仅构造少量Client
个实例。处置之前必须正确关闭Client
个实例以避免资源泄漏。
RESTEasy不会在Client
上自动注册过滤器和拦截器。当使用@Provider
注释过滤器或拦截器时,它会发生在服务器端。但在客户端,您必须手动注册过滤器和拦截器 。
您可以在Client
实例中注册过滤器和拦截器,而不是在Configuration
实例中注册过滤器和拦截器,并使用它来创建Client
实例:
Configuration config = new Configuration();
config.register(MyClientResponseFilter.class);
config.register(new AnotherClientFilter());
Client client = ClientBuilder.newClient(config);
在使用相同配置创建多个客户端时,它可能很有用。