如何装饰 PerConnectionWebSocketHandler 中的 websocket 处理程序?

How do I decorate a websocket handler within PerConnectionWebSocketHandler?

我是这样使用 PerConnectionWebSocketHandler 的:

@Bean
public WebSocketHandler myHandler() {
    return new PerConnectionWebSocketHandler(MyHandler.class));
}

其中 MyHandler 是 class 实现 Spring WebSocketHandler 接口。

我想添加一个异常处理装饰器,对于单个实例可以这样创建:

new ExceptionWebSocketHandlerDecorator(new MyHandler() );

我需要 ExceptionWebSocketHandlerDecorator 由 PerConnectionWebSocketHandler 包装。当 ExceptionWebSocketHandlerDecorator 在外面时,MyHandler 抛出的异常导致 MyHandler.afterConnectionClosed 没有被调用。

如何将其与 PerConnectionWebSocketHandler 结合使用?

WebSocketHandler可以相互嵌套:

@Bean
public WebSocketHandler myHandler() {
    return new PerConnectionWebSocketHandler(MyHandler.class));
}

@Bean
public WebSocketHandler myHandlerDecorator() {
    return new ExceptionWebSocketHandlerDecorator(myHandler());
}

这适用于以下情况,当您要使用 BeanFactory 自动装配您的目标 MyHandler 或通过简单的方式:

@Bean
public WebSocketHandler myHandlerDecorator() {
    return new ExceptionWebSocketHandlerDecorator(
                   new PerConnectionWebSocketHandler(MyHandler.class)));
}

如果没有。

此外,您还可以考虑链接到 LoggingWebSocketHandlerDecorator

更新

根据您的评论,我建议编写您自己的 ExceptionWebSocketHandler 或在您的 MyHandler 中实现所有 ExceptionWebSocketHandlerDecorator 逻辑。那是因为 PerConnectionWebSocketHandler 需要 class 和默认构造函数,即使它被委托给 this.beanFactory.createBean(this.handlerType).

更新2

The difficulty with this approach is that I have more than one handler,

好吧,那你可以实现自己的PerConnectionExceptionWebSocketHandler!与 ExceptionWebSocketHandlerDecoratorPerConnectionWebSocketHandler 的逻辑相同。或者只是扩展 PerConnectionWebSocketHandler 并覆盖你需要的。