Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在定制的AOP advisor中获取HttpServletRequest?_Java_Spring_Spring Mvc_Spring Aop - Fatal编程技术网

Java 如何在定制的AOP advisor中获取HttpServletRequest?

Java 如何在定制的AOP advisor中获取HttpServletRequest?,java,spring,spring-mvc,spring-aop,Java,Spring,Spring Mvc,Spring Aop,上下文: 在我的SpringMVC应用程序中,我有一个拦截控制器方法的顾问(我的AOP工作得很好)。在advice类中,我试图通过调用HttpServletRequest.getRemoteUser()来提取信息。然后我需要从DB加载用户权限。 我的代码 拦截器类(实现MethodInterceptor): 私有HttpServletRequest=((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(

上下文:
在我的SpringMVC应用程序中,我有一个拦截控制器方法的顾问(我的AOP工作得很好)。在advice类中,我试图通过调用HttpServletRequest.getRemoteUser()来提取信息。然后我需要从DB加载用户权限。

我的代码 拦截器类(实现
MethodInterceptor
):

私有HttpServletRequest=((ServletRequestAttributes)
RequestContextHolder.currentRequestAttributes()).getRequest()

web.xml
中:

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
调度员
org.springframework.web.servlet.DispatcherServlet
1.
调度员
/
结果/问题

我仍然得到
java.lang.IllegalStateException:未找到线程绑定的请求
,异常仍然建议使用
RequestContextListener
RequestContextFilter

我已经搜索了很多关于堆栈溢出和其他地方,但没有运气。任何帮助都将不胜感激!(请接受我的老问题:P)

更新:

我想我指的是实际web请求之外的请求属性,这就是为什么RequestContextListener没有帮助


我还有什么办法可以得到当前的请求吗?

供将来的开发者参考。
当您获得
java.lang.IllegalStateException:No thread bound request found exception
时,建议使用
RequestContextListener
RequestContextFilter

您可能遇到了以下两种情况之一

情况1

您没有使用
org.springframework.web.servlet.DispatcherServlet
(例如,它不在您的web.xml中,或者它不是Spring MVC应用程序)。
然后,您可能希望将
RequestContextListener
添加到web.xml:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
那么你的代码就应该开始工作了

第二种情况

您希望在HttpServletRequest的原始上下文之外访问它,那么以下代码应该会有所帮助:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
确保将代码放在方法中,而不是放在方法的类中

区别如下:
类内部:只是在初始化时需要创建一个对象,这将引发异常,因为在这个阶段根本没有请求!

内部方法:当有实际请求传入时,它将在运行时创建。这将非常好。

什么编辑?请发布完整的堆栈跟踪。@Taylor我已经添加了堆栈跟踪。(我删除了一些行。它是400+)看起来这是在初始化时触发的,这意味着不会有请求。您应该让Aspect按需检索请求,或者委托给原型范围的bean。
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();