如何在PerConnectionWebSocketHandler中修饰websocket处理程序?

时间:2015-02-26 06:10:29

标签: java spring java-ee spring-websocket

我正在使用PerConnectionWebSocketHandler:

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

其中MyHandler是一个实现Spring WebSocketHandler接口的类。

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

new ExceptionWebSocketHandlerDecorator(new MyHandler() );

我需要PerceptionWebSocketHandlerDecorator包装PerConnectionWebSocketHandler。当ExceptionWebSocketHandlerDecorator在外部时,MyHandler抛出的异常导致MyHandler.afterConnectionClosed未被调用。

如何将其与PerConnectionWebSocketHandler结合使用?

1 个答案:

答案 0 :(得分:2)

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或在ExceptionWebSocketHandlerDecorator中实施所有MyHandler逻辑。这是因为PerConnectionWebSocketHandler要求具有默认构造函数的类,即使它被委托给this.beanFactory.createBean(this.handlerType)

<强> UPDATE2

  

这种方法的难点在于我有多个处理程序,

那么你可以实现自己的PerConnectionExceptionWebSocketHandler!使用ExceptionWebSocketHandlerDecoratorPerConnectionWebSocketHandler中的相同逻辑。或者只是扩展PerConnectionWebSocketHandler并覆盖您需要的内容。