我有一个控制器,希望每个会话都唯一。根据spring文档,实现有两个细节:
1.初始Web配置
为了在请求,会话和全局会话级别(网络范围的Bean)支持Bean的作用域,在定义Bean之前,需要一些较小的初始配置。
web.xml如文档所示,我已经添加了以下内容:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
2.范围豆作为依赖项
如果要将(例如)HTTP请求范围的bean注入另一个bean,则必须注入AOP代理来代替范围的bean。
我通过@Scope提供proxyMode如下所示对bean进行了注释:
@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ReportBuilder implements Serializable {
...
...
}
问题
尽管进行了上述配置,我还是收到以下异常:
org.springframework.beans.factory.BeanCreationException:创建名称为“ scopedTarget.reportBuilder”的bean时出错:当前线程的作用域“会话”未激活;如果您打算从单例中引用它,请考虑为此bean定义作用域代理。嵌套异常为java.lang.IllegalStateException:未找到线程绑定的请求:您是在实际Web请求之外引用请求属性,还是在原始接收线程之外处理请求?如果您实际上是在Web请求中操作并且仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。
更新1
以下是我的组件扫描。我有以下内容web.xml:
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>org.example.AppConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
以及以下内容AppConfig.java:
@Configuration
@EnableAsync
@EnableCaching
@ComponentScan("org.example")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements AsyncConfigurer {
...
...
}
更新2
我创建了一个可重现的测试用例。这是一个较小的项目,因此存在差异,但是会发生相同的错误。有相当多的文件,所以我上传它作为一个tar.gz以megafileupload。
qq_遁去的一_1
largeQ
哈士奇WWW