Java Apache HttpClient.execute的Spring AOP监视

Java Apache HttpClient.execute的Spring AOP监视,java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,我想监控传出请求的时间,以跟踪我的应用程序中的HTTP集成。它们的通用代码路径都是HttpClient.execute,因此这似乎是AOP的自然目标: @Around("execution(* org.apache.http.client.HttpClient.execute(..)) && args(httpUriRequest)") public Object timeApacheRequest(ProceedingJoinPoint proceedingJoinPoint,

我想监控传出请求的时间,以跟踪我的应用程序中的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
HttpComponents客户端HttpRequestFactory
code会破坏它的
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
操作签入
httpcomponents客户端httprequestfactory

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的配置类上建立了带有
@enableaspectProxy
注释的当前代理

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

JDK代理仅支持超级接口。
newProxyInstance
(创建JDK代理的入口点)返回的实例将有一个超类型的
Proxy

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

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


然后,代理将属于
CloseableHttpClient
的子类型,并且
instanceof
将起作用。

您如何声明代理?-为了澄清-aspectj:autoproxy还是类似的东西?@DaveG,仅你的评论就给了我正确的方向——它让我发现了注释的
proxyTargetClass
属性,这似乎正是我所需要的。我想知道你是否能更好地解释一下你所看到的使用它的利弊?