@PostConstruction尝试初始化作用域服务 - 而不是在方法

时间:2017-12-13 14:12:18

标签: java spring spring-mvc scope postconstruct

我有一个使用自动服务的@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没有任何关联。

可以做些什么? 我会很感激任何想法。

0 个答案:

没有答案