Kiv*_*iva 5 spring event-handling
我想使用 Spring Event 与我的 Web 应用程序中的 bean 进行“对话”。
例如,我的触发事件的 bean 是这样的:
@Controller
@Scope("request")
@KeepAlive
public class Controller extends InitializingBean, ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
public void test() {
applicationEventPublisher.publishEvent(new TestEvent(this));
}
}
Run Code Online (Sandbox Code Playgroud)
我的监听器事件是这样的:
@Component
@Scope("request")
@KeepAlive
public class Module implements ApplicationListener<TestEvent> {
@Override
public void onApplicationEvent(TestEvent event) {
}
}
Run Code Online (Sandbox Code Playgroud)
最重要的一点是这些 bean 是范围请求,因为它们需要在每次调用页面时进行初始化。
但在启动时,我收到以下消息:
引起原因:java.lang.IllegalStateException:未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在 Web 请求中进行操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 公开当前请求。
就像如果 Spring 尝试在启动时实例化我的模块 bean,并且由于该 bean 是作用域请求,它就无法执行此操作(上下文请求未实例化)
如果我删除事件管理,一切都会正常。
所以,我的问题是:
是否可以将事件侦听器作为范围请求?以及如何做到这一点?
谢谢
尝试在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2248 次 |
| 最近记录: |