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

Spring请求范围bean代理bean无法注入

廖臻
2023-03-14
@Component
@Scope(value="request", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Lazy
public class AnyBean {
...
}
@Service
@Transactional
public class AnyService {
    @Autowired
    private AnyBean anyBean;
}
@Configuration
@EnableCommonsPersistenceAutoConfguration
@ImportResource({
   ....
})
@EnableAspectJAutoProxy
public class ApplicationTest {
...
}

我得到的错误是:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'anyBean': Scope 'request' 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.
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:352)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
    ... 57 more
Caused by: 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.
    at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
    at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:41)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
    ... 62 more

我检查的内容:

>

  • 已启用批注处理,否则AnyService根本不会实例化
  • AnyBean不是最终的
  • 请求作用域在AnyBean中与AspectJ代理(ScopedProxyMode.target_class)
  • 一起定义
  • 存在EnableAspectJAutoproxy批注
  • 类路径上有以下JAR:

    Web XML还包含RequestContextListener:

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

    当我向org.springframework.aop.config.ScopedProxyBeanDefinitionDecorator.Decorate(节点,BeanDefinitionHolder,ParserContext)添加断点时,它根本不会被触发。

  • 共有1个答案

    雷曜灿
    2023-03-14

    解决方案是我的spring上下文有点混乱。AnyBean不是基于注释处理实例化的。我在一个XML配置中找到了它,在这里直接创建它,如下所示:

    <bean id="anyBean" class="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.AnyBean"  scope="request" lazy-init="true"/>
    

    我这样一改,就管用了:

    <bean id="anyBean" class="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.AnyBean"  scope="request" lazy-init="true">
        <aop:scoped-proxy proxy-target-class="true"/>
    </bean>
    

    我喜欢将注释和基于xml的配置混在一起:)

     类似资料:
    • 我试图用jsf和CDI编写一个简单的登录表单。问题是当我注入我的SessionScoped bean时,它不像我期望的那样工作。这是我的豆子 这是我的控制器: 还有一个简单的Jsf表单,它调用login函数并显示LoginInfo类的计数器字段。 通过单击登录按钮和调试变量,我可以看到“lo”是这样的: lo={LoginInfo$Proxy$_$$_WeldClientProxy@16688}“

    • 问题内容: 有人可以解释一下我一直只使用“原型”的Spring bean的作用域吗,但是还有其他参数可以代替吗? 我在说什么的例子 问题答案: 从Spring规范开始,支持五种类型的bean作用域: 1.单身人士(默认*) 每个Spring IoC容器将单个bean定义的作用域限定为单个对象实例。 2.原型 将单个bean定义的作用域限定为任意数量的对象实例。 3.要求 将单个bean定义的范围限

    • 问题内容: 我正在尝试在Spring中建立一个请求范围的bean。 我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。 由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ? 问题答案: 可以将请求范围的Bean与请求对象自动连接。

    • 本文解释了可以将RequestScoped Bean注入ApplicationScoped Bean中,并且客户机代理将在请求期间指向正确的实例:在CDI中,较短范围的Bean实例注入较大范围的Bean实例中-它是如何工作的? 当使用一个单独的生产者类进行额外处理并生成RequestScoped bean时,这是如何工作的?在部署到应用服务器时,由于不明确的依赖关系,我得到一个Deployment

    • 问题内容: 有人可以解释spring 注释的用法吗?我 以为 这与会话范围的Bean有关,但是我不太确定是什么。 在作用域的使用中,我使用了没有注解(或没有aop作用域代理)的会话作用域bean ,所以我真的确定如何正确使用它。 问题答案: spring文档的3.4.4.5节对此进行了很好的解释: (请注意,以下“ userPreferences” Bean定义不完整): 从上面的配置中可以明显看

    • 问题内容: 我需要将参数(POST)传递给@managedBean,我使用了如下托管属性: Bean的范围是ViewScope 我最终遇到此错误: 无法创建托管bean收据。发现了以下问题:-由表达式#{param.id} request引用的对象的范围比引用托管Bean的视图范围要短。 我能做什么? arjan看看: 我的页面:Facelet标题 问题答案: 两种方式: 使bean请求成为作用域