gpt4 book ai didi

java - Apache HttpClient.execute的Spring AOP监控

转载 作者:行者123 更新时间:2023-11-30 10:55:56 27 4
gpt4 key购买 nike

我想监控传出请求的时间以跟踪我的应用程序中的 HTTP 集成。所有这些的通用代码路径是 HttpClient.execute,因此这似乎是 AOP 的自然目标:

@Around("execution(* org.apache.http.client.HttpClient.execute(..)) && args(httpUriRequest)")
public Object timeApacheRequest(ProceedingJoinPoint proceedingJoinPoint, HttpUriRequest httpUriRequest) throws Throwable {
// etc.
}

但是,当我使用我的代理时,与 Spring HttpComponentsClientHttpRequestFactory 交互的代码会崩溃,它是 instanceof 检查传入的代理。

Caused by: java.lang.IllegalArgumentException: 'httpClient' is not of type CloseableHttpClient Object of class [com.sun.proxy.$Proxy22] must be an instance of class org.apache.http.impl.client.CloseableHttpClient

HttpComponentsClientHttpRequestFactory中的操作检查:

public HttpComponentsClientHttpRequestFactory(HttpClient httpClient) {
Assert.notNull(httpClient, "'httpClient' must not be null");
Assert.isInstanceOf(CloseableHttpClient.class, httpClient, "'httpClient' is not of type CloseableHttpClient");
this.httpClient = (CloseableHttpClient) httpClient;
}

有没有更好的方法来构建我的代理来避免这个问题?

澄清一下,目前我在声明 bean 的配置类上使用 @EnableAspectJAutoProxy 注释建立当前代理。

最佳答案

默认情况下,@EnableAspectJAutoProxy(以及大多数生成代理的配置、@EnableTransactionManagementEnableAsync 等)使用 JDK proxies

JDK 代理只支持 super 接口(interface)。 newProxyInstance(创建 JDK 代理的入口点)返回的实例将具有 Proxy 的父类(super class)型。

为了支持您的方面和建议,Spring 必须代理与您的连接点匹配的任何实例。由于默认配置,这些代理只维护真实对象的 super 接口(interface)。 CloseableHttpClient 是一个抽象类。那是迷路了。代理没有该类型,因此 instanceof 将失败。

相反,您可以将 @EnableAspectJAutoProxy#proxyTargetClass() 配置为 true,以便 Spring 使用 CGLIB 来代理您的对象。 CGLIB 比 JDK 代理更强大。 CGLIB 可以子类化目标对象的类(除非它的类是 final 或具有 private 构造函数)。

然后代理将是 CloseableHttpClient 的子类型并且 instanceof 可以工作。

关于java - Apache HttpClient.execute的Spring AOP监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com