Spring事件和范围请求

时间:2013-02-15 11:21:30

标签: spring event-handling

我想在我的网络应用程序中使用Spring Event与我的bean“说话”。

因此,例如,我的触发事件的bean是这样的:

@Controller
@Scope("request")
@KeepAlive
public class Controller extends InitializingBean, ApplicationEventPublisherAware {

private ApplicationEventPublisher applicationEventPublisher;    

public void test() {
  applicationEventPublisher.publishEvent(new TestEvent(this));
}

}

我的听众事件是这样的:

@Component
@Scope("request")
@KeepAlive
public class Module implements ApplicationListener<TestEvent> {

    @Override
    public void onApplicationEvent(TestEvent event) {

    }

}

最重要的一点是这些bean是范围请求,因为它们需要在每次调用页面时进行初始化。

但是在启动时,我收到了这条消息:

  

引起:java.lang.IllegalStateException:没有线程绑定请求   发现:您是指实际的请求属性吗?   Web请求,或处理原始请求之外的请求   接收线程?如果您实际在Web请求中操作   并且仍然收到此消息,您的代码可能正在外面运行   DispatcherServlet / DispatcherPortlet:在这种情况下,请使用   RequestContextListener或RequestContextFilter公开当前   请求。

如果Spring尝试在启动时实例化我的Module bean并且bean是作用域请求,那么就不能这样做(上下文请求不是实例化的)

如果删除事件管理,一切正常。

所以,我的问题是:

是否可以让事件监听器是范围请求?怎么做?

由于

1 个答案:

答案 0 :(得分:0)

尝试在Singleton ApplicationListener中注入一个范围内的代理来处理TestEvent。

@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="request")
public class TestEventHandler {

    public void onTestEvent(TestEvent event) 
        // ...  
    }

}
  public class TestEventApplicationListener implements ApplicationListener<TestEvent> {

    @Autowired
    private TestEventHandler handler;

    @Override
    public void onApplicationEvent(TestEvent event) {

        handler.onTestEvent(event);

    }
}