我有一个使用自动服务的@PostConstruct注释的方法
@Service
public ServiceWithPostConstruct{
private AutowiredService autowiredService;
@Autowired
public ServiceWithPostConstruct(AutowiredService autowiredService) {
this.autowiredService= autowiredService;
}
@PostConstruct
public void doSomething() {
autowiredService.doSomethingElse();
}
}
AutowiredService声明
@Component
public class AutowiredService {
private static final Logger LOGGER = LoggerFactory.getLogger(AutowiredService .class);
private static final String SUCCESS_CODE = "0";
private RestOperations restOperations;
@Autowired
public AutowiredService (RestOperations restOperations) {
this.restOperations = restOperations;
}
///
}
代码中的其他地方,我有一个完全不相关的组件,它有一个scope = request
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ScopedService{
}
和web.xml中的监听器
org.springframework.web.context.request.RequestContextListener
此服务在使用它的地方正常工作。
但是在启动应用程序时,我收到以下错误:
12-Dec-2017 13:24:15.221严重[localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart异常 将上下文初始化事件发送到类的侦听器实例 org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.UnsatisfiedDependencyException: 创建在文件中定义名称为“controller”的bean时出错 [controller.class]: 通过构造函数参数1表示的不满意的依赖性; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'serviceWithPostConstruct'的bean: 调用init方法失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'scopedTarget.scopedService'的bean:Scope 'request'对当前线程无效;考虑定义一个 如果你打算从a引用它,那么这个bean的scoped代理 单;嵌套异常是java.lang.IllegalStateException:否 发现线程绑定请求:您是指请求属性 在实际的Web请求之外,或处理外部的请求 原来收到的帖子?如果你实际在里面经营 一个Web请求仍然收到此消息,您的代码可能是 在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下, 使用RequestContextListener或RequestContextFilter来公开 当前的要求。
如果我要自动装配提到的ScopedService,可能已经理解了这个错误。但显然我不是。我不明白,为什么这个@PostConstruct方法与ScopedService有什么关系。 如果我删除@PostConstruct注释问题就消失了。并且ScopedService也可以在Singletons中按预期运行。但是,只有当我摆脱@PostConstruct注释时。不幸的是,我需要保留它。
我确信在doSomething()方法中使用自动装配服务是问题的核心,如果我删除自动装配的服务,应用程序就会正确启动。 看来,由于这个@PostConstruct方法,Spring检查所有服务,当它涉及ScopedService(唯一具有scope = request的组件)时,它认识到在那一刻没有HttpRequest并抛出错误。为什么?它与ScopedService没有任何关联。
可以做些什么? 我会很感激任何想法。