当前位置: 首页 > 知识库问答 >
问题:

java.lang.IllegalStateException:未找到线程绑定请求,方面出现异常

何楷
2023-03-14

以下是我的方面:

    @Configurable
    @Aspect
    public class TimingAspect {

        @Autowired
        private HttpServletRequest httpServletRequest;

        // Generic performance logger for any mothod
        private Object logPerfomanceInfo(ProceedingJoinPoint joinPoint, String remoteAddress) {
            StringBuilder tag = new StringBuilder();
            if (joinPoint.getTarget() != null) {
                tag.append(joinPoint.getTarget().getClass().getName());
                tag.append(".");
            }
            tag.append(joinPoint.getSignature().getName());
            StopWatch stopWatch = new StopWatch(tag.toString());
            Object result = joinPoint.proceed(); // continue on the intercepted method
            stopWatch.stop();

            PerformanceUtils.logInPerf4jFormat(stopWatch.getStartTime(), stopWatch.getElapsedTime(), stopWatch.getTag(), stopWatch.getMessage(), remoteAddress);
            return result;
        }

        @Around("execution(* $$$.$$$.$$$.api.controller.*.*(..))")
        public Object logAroundApis(ProceedingJoinPoint joinPoint) throws Throwable {
            String remoteAddress = null;
            if (httpServletRequest != null) {
               remoteAddress = httpServletRequest.getRemoteAddr();
            }
            return logPerfomanceInfo(joinPoint, remoteAddress);
        }

        @Around("execution(* $$$.$$$.$$$.$$$.$$$.$$$.*(..))")
        public Object logAroundService(ProceedingJoinPoint joinPoint) throws Throwable {
            String remoteAddress = null;
            if (httpServletRequest != null) {
                remoteAddress = httpServletRequest.getRemoteAddr();
            }
            return logPerfomanceInfo(joinPoint, remoteAddress);
        }

共有1个答案

庄浩言
2023-03-14

您不应该在您的方面自带HttpServletRequest,因为这会将您的方面绑定为只能为从正在执行的HttpServletRequest中调用的类运行。

在需要请求时,可以使用RequestContextHolder来获取请求。

private String getRemoteAddress() {
    RequestAttributes attribs = RequestContextHolder.getRequestAttributes();
    if (attribs instanceof NativeWebRequest) {
        HttpServletRequest request = (HttpServletRequest) ((NativeWebRequest) attribs).getNativeRequest();
        return request.getRemoteAddr();
    }
    return null;
}
 类似资料:
  • 为了在请求、会话和全局会话级别支持bean的范围(Web范围bean),在定义bean之前需要进行一些次要的初始配置。 我在中添加了以下内容,如文档所示: 2.将bean限定为依赖项 org.springframework.beans.factory.BeanCreationException:创建名为“ScopedTarget.ReportBuilder”的bean时出错:当前线程的作用域“se

  • 以下是我从IntelliJ获得的代码: 当我在spark-shell中运行它时,它正在运行文件:/opt/spark/bin/spark-shell--jars/home/tigergraph/ecosys/tools/etl/tg-jdbc-driver/tg-jdbc-driver-1.2.jar 我怎么才能修好?

  • 问题内容: 我有一个控制器,希望每个会话都唯一。根据spring文档,实现有两个细节: 1.初始Web配置 为了支持在请求,会话和全局会话级别(Web范围的Bean)的Bean范围界定,在定义Bean之前,需要一些较小的初始配置。 web.xml如文档所示,我已经添加了以下内容: 2.范围豆作为依赖项 如果要将(例如)HTTP请求范围的bean注入另一个bean,则必须注入AOP代理来代替范围的b

  • 所以我有3个不同的类,每个都有一个扫描仪。在main方法中,我循环遍历这些类,并为每个类输入几次。问题是当我关闭扫描仪(scanner.close();)时,我只能迭代一次,执行的第一个类,然后我得到这个错误:线程“main”中的异常java.util.NoSuchElementException:找不到行。当我不关闭扫描仪时,一切都很好,但我不想有内存泄漏。如果发布代码可以帮助您更好地理解我的问

  • 我有一个关于多线程和StringProperty绑定的问题。 我有一个类CacheManager,它包含一个线程,可以根据服务器上的更改更新缓存。现在,我想用文本和进度百分比(JavaFX中的标签和进度条)通知用户。为此,我使用公共静态的DoubleProperty和StringProperty,它们是在CacheManager类中定义的。我只是这样装订: 现在,在Updater线程中,我更新了这

  • 问题内容: 我有一个关于多线程和StringProperty绑定的问题。 我有一个类,其中包含,该类使用服务器上的更改更新缓存。现在,我想用文本和进度百分比(在JavaFX 中为和)通知用户。我使用公共静态和对于这一点,这是在定义类。我只是这样绑定它: 现在,在Updater线程中,我更新了这些。使用此方法效果很好,并且可以完美地显示进度。但是,使用状态(这是的文本)更新会引发错误: 现在,我的问