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

spring中使用作用域代理bean时出错

赫连智
2023-03-14

我在spring中尝试使用会话范围的bean时出错,错误是:

HTTP Status 500 - Error creating bean with name 'scopedTarget.usuarioAutenticado': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

我的配置是:网络。xml:

<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            WEB-INF/applicationContext*.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/sys/*</url-pattern>
</servlet-mapping>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

豆子:

<bean id="usuarioAutenticado" class="com.wi.security.UsuarioAutenticado" scope="session">
    <aop:scoped-proxy/>
</bean>

我一直在寻找这个问题,我所找到的是添加以下行web.xml:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

这解决了问题,但副作用是,我所有的@Scheduled注释方法都运行了两次,我认为这是因为spring创建了两个上下文。

阅读Spring文档它说:

DispatcherServlet、RequestContextListener和RequestContextFilter都做完全相同的事情,即将HTTP请求对象绑定到为该请求提供服务的线程。这使得请求和会话范围的bean在调用链的更下游可用。

所以,我不明白为什么不使用DispatcherServlet配置。希望有人能帮我找到解决办法,我是Spring的新手。提前谢谢。

共有1个答案

夏志国
2023-03-14

拿到了!

我在我的web.xml中设置了以下内容:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext*.xml</param-value>
</context-param>

然后在servlet配置中再次设置它:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

解决方法是删除servlet参数-value:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value/>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
 类似资料:
  • 主要内容:singleton,prototype默认情况下,所有的 Spring Bean 都是单例的,也就是说在整个 Spring 应用中, Bean 的实例只有一个。 我们可以在 <bean> 元素中添加 scope 属性来配置 Spring Bean 的作用范围。例如,如果每次获取 Bean 时,都需要一个新的 Bean 实例,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需要每次都返回一个相同

  • 问题内容: 我将JSF 2用于视图,将Spring用于业务逻辑。我正在尝试使用注解(@Scope(“ session”))将会话范围设置为我的一个Spring bean,但是却遇到了这个异常: 我知道RequestContextListener。在我的web.xml中。我还添加了RequestContextFilter: 似乎没有任何作用。我究竟做错了什么?谢谢! 问题答案: 尝试使用aop:sc

  • Spring框架中session和globalSession的区别是什么? 根据我的研究,这两者在Web感知的Spring ApplicationContext上下文中都是有效的。

  • 问题内容: 正如我们所知道Spring使用代理来增加功能(和举例)。有两种选择- 使用JDK动态代理(该类必须实现非空接口),或使用CGLIB代码生成器生成子类。我一直认为proxyMode允许我在JDK动态代理和CGLIB之间进行选择。 但是我能够创建一个示例,说明我的假设是错误的: 情况1: 单身人士: 原型: 主要: 输出: 在这里我们可以看到两件事: 只实例化了 一次 。 为了添加的功能,

  • 众所周知,Spring使用代理添加功能(例如和)。有两种选择--使用JDK动态代理(类必须实现非空接口),或者使用CGLIB代码生成器生成子类。我一直认为proxyMode允许我在JDK动态代理和CGLIB之间进行选择。 但我能创造一个例子,说明我的假设是错误的: 单身: 这里我们可以看到两点: 只实例化了一次。 要为添加功能,Spring使用了cglib。 让我更正定义: 实例化了3次。 要为添

  • 问题内容: 我在tomcat中运行一个Web应用程序,其中使用ThreadPool(Java 5 ExecutorService)并行运行IO密集型操作以提高性能。我希望在每个合并线程中使用的某些bean在请求范围内,但是ThreadPool中的Threads无法访问spring上下文并导致代理失败。关于如何使Spring上下文可用于ThreadPool中的线程来解决代理故障的任何想法? 我猜想必