Java 在实际web请求之外引用请求属性时如何避免IllegalStateException 我正在研究一个解决方案,如果我在Web请求的中间或者其他的话,应该做一些事情。< /P>

Java 在实际web请求之外引用请求属性时如何避免IllegalStateException 我正在研究一个解决方案,如果我在Web请求的中间或者其他的话,应该做一些事情。< /P>,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在做的是 @Autowired private HttpServletRequest request; 然后尝试访问一个变量: request.getRequestURI() 但是我得到了java.lang.IllegalStateException:没有找到线程绑定请求:您是指实际web请求之外的请求属性… 我想避免这个异常,并以某种方式询问HttpServletRequestweather我是否在web请求中 有什么办法吗 例如: 其他信息: 您可能应该(未经测试)使用: 返回当前绑

我正在做的是

@Autowired private HttpServletRequest request;
然后尝试访问一个变量:

request.getRequestURI()
但是我得到了
java.lang.IllegalStateException:没有找到线程绑定请求:您是指实际web请求之外的请求属性…

我想避免这个异常,并以某种方式询问
HttpServletRequest
weather我是否在web请求中

有什么办法吗

例如: 其他信息:

您可能应该(未经测试)使用:

返回当前绑定到线程的RequestAttributes

返回: RequestAttributes当前绑定到线程,如果未绑定,则为null


因此,如果该方法返回null,则当前线程不处理请求。如果它返回一个非空值,那么它正在处理一个。

这在我看来就像是设计的味道。为什么不使用两个不同的bean:一个用于处理请求的组件,另一个用于不处理请求的组件?或者只是让调用方将请求或null传递给方法?你能在更高的层次上解释一下你想要实现什么吗?我正在覆盖整个系统的日志记录。我想在一个不同的记录器中记录请求上下文中的所有日志,如果没有大规模耦合,就无法像您提到的那样完成,我添加了这个问题,以便让您看到我正在不知从何处做什么
getRequestAttributes()
是一个静态方法。因此,您只需调用
RequestContextHolder.getRequestAttributes()
。RequestContextHolder会随着每个请求而更新吗?因为HttpServletRequest正在自动更新。正如javadoc所指出的,它返回当前绑定到线程的请求属性。每次DispatcherServlet处理请求时,请求属性都绑定到处理该请求的线程。
@Override
public void trace(String msg) { 
    if (loggerFactory.isRegisteredUrl(request.getRequestURI())){
        loggerFactory.getCustomeLogger(request.getRequestURI()).trace(msg);
        return;
    }
    nativelogger.trace(msg);
}