@Async @Aspect @AfterReturnung。我的方法有 HttpServletRequest 对象作为方法参数,但能够访问它我的 aop 方法

Posted

技术标签:

【中文标题】@Async @Aspect @AfterReturnung。我的方法有 HttpServletRequest 对象作为方法参数,但能够访问它我的 aop 方法【英文标题】:@Async @Aspect @AfterReturnung. My method has HttpServletRequest object as method argument, but able to access it my aop method 【发布时间】:2016-05-21 09:23:57 【问题描述】:

我正在尝试以异步模式通过 aop 记录 HttpServletRequest 内容。实现切入点的方法以 HttpServletRequest 作为方法参数。我无法在异步模式下访问它,尽管代码在没有 @Async 注释的情况下可以正常工作。

@Async
@AfterReturning(pointcut = "execution(* com.web.dto.util.response.impl.ResponseImpl.prepareResponseDTO(..))", returning = "object")
    public void logSearchJSON(JoinPoint joinPoint, final Object object) 
        try 
            List<Object> objects = getActivityParams(joinPoint);

            UserActivity userPersonalization = null;
            HttpServletRequest httpServletRequest = (HttpServletRequest) objects.get(0);
            if (httpServletRequest.getRequestURI().contains(UserActivityConstant.filter)) 

httpServletRequest.getRequestURI() returns null.

没有@Async 注释也可以正常工作

【问题讨论】:

【参考方案1】:

您是否正确声明了任务执行者?

你可以在你的 Spring 上下文中这样做:

<task:annotation-driven executor="TaskExecutor"/>
<task:executor id="TaskExecutor"
                   pool-size="2-5"
                   queue-capacity="50"
                   keep-alive="120"
                   rejection-policy="CALLER_RUNS"/>

您也可以在 @Configuration 类中执行此操作。

【讨论】:

以上是关于@Async @Aspect @AfterReturnung。我的方法有 HttpServletRequest 对象作为方法参数,但能够访问它我的 aop 方法的主要内容,如果未能解决你的问题,请参考以下文章

aspect怎么用

aspect怎么读

Spring Aspect 获取请求参数

Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class

Resultful API的拦截(切片Aspect)

Resultful API的拦截(切片Aspect)