我想在我的网络应用程序中使用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是作用域请求,那么就不能这样做(上下文请求不是实例化的)
如果删除事件管理,一切正常。
所以,我的问题是:
是否可以让事件监听器是范围请求?怎么做?
由于
答案 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);
}
}