我有一个控制器,希望每个会话都唯一。根据spring文档,实现有两个细节:
1.初始Web配置
为了支持在请求,会话和全局会话级别(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: Error creating bean with name 'scopedTarget.reportBuilder': 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.
更新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。
问题不在于你的Spring注释,而在于你的设计模式。你将不同的作用域和线程混合在一起:
单身人士可以在任何地方使用,没关系。但是,会话/请求范围在附加到请求的线程之外不可用。
即使请求或会话不再存在,异步作业也可以运行,因此无法使用依赖于请求/会话的bean。同样也没有办法知道,如果你正在另一个线程中运行作业,那么哪个线程是发起者请求(这意味着aop:proxy在这种情况下没有帮助)。
我觉得你的代码看起来像要作合同 ReportController,报表制作,UselessTask和ReportPage之间。有没有办法只使用一个简单的类(POJO)从UselessTask中存储数据并在ReportController或ReportPage中读取它,而不再使用ReportBuilder?
为了在请求、会话和全局会话级别支持bean的范围(Web范围bean),在定义bean之前需要进行一些次要的初始配置。 我在中添加了以下内容,如文档所示: 2.将bean限定为依赖项 org.springframework.beans.factory.BeanCreationException:创建名为“ScopedTarget.ReportBuilder”的bean时出错:当前线程的作用域“se
问题内容: 我在Spring3和Hibernte4中遇到上述异常 以下是我的bean xml文件 我的BaseDAO类看起来像这样 以下代码在标题中引发异常 有谁知道如何解决这个问题? 问题答案: 仅在交易范围内有意义。 您需要声明一个适当的事务管理器,划分事务边界并在其中进行数据访问。例如,如下: 。 也可以看看: 10.交易管理 13.3hibernate
问题内容: 我收到以下错误 服务等级 DAO类 我在我的application-context.xml中有这个 谁能发现我为什么出现以下错误? 问题答案: 您使用@Transactional为Dao类添加了注释,但没有为服务类添加注释。该行: 要求您进行交易。 您可以通过将@Transactional批注添加到ProfileService类,或者只添加registerVisitor()方法来解决此
问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何
我试图在一个演示的独立应用程序中使用Spring,使用DAO层和服务层来使用委托的Hibernate事务。 我已经正确地设置了配置,并且我已经对DAO方法上使用@Transactional注释进行了单元测试,测试结果表明它可以正常工作,但是当我将这个注释移动到服务层时,我得到了一个: 我提供了代码中最相关的部分,希望您能给我一个提示,让我了解这里发生了什么。 在GenericDaoHibernat
我得到以下错误 服务级别 刀类钻头 这个在我application-context.xml 有人能指出为什么我会得到下面的错误吗?