4

我想在我的 Web 应用程序中使用 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 是范围请求一样,它不能这样做(上下文请求未实例化)

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

所以,我的问题是:

是否有可能让事件监听器是范围请求?以及如何做到这一点?

谢谢

4

1 回答 1

1

尝试在 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);

    }
}
于 2013-02-15T14:23:29.567 回答