Avoid duplicates from <websocket:decorator-factory>
Before this change <websocket:decorator-factory> decorated to the SubProtocolWebSocketHandler RootBeanDefinition rather than using a RuntimeBeanReference, which led to a separate instance of SubProtocolWebSocketHandler to be created. Issue: SPR-13190
This commit is contained in:
@@ -61,6 +61,8 @@ import org.springframework.web.servlet.HandlerMapping;
|
||||
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
|
||||
import org.springframework.web.socket.WebSocketHandler;
|
||||
import org.springframework.web.socket.WebSocketSession;
|
||||
import org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator;
|
||||
import org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator;
|
||||
import org.springframework.web.socket.handler.TestWebSocketSession;
|
||||
import org.springframework.web.socket.handler.WebSocketHandlerDecorator;
|
||||
import org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory;
|
||||
@@ -75,8 +77,15 @@ import org.springframework.web.socket.sockjs.transport.TransportType;
|
||||
import org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService;
|
||||
import org.springframework.web.socket.sockjs.transport.handler.WebSocketTransportHandler;
|
||||
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.hamcrest.Matchers.contains;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
/**
|
||||
* Test fixture for MessageBrokerBeanDefinitionParser.
|
||||
@@ -123,9 +132,15 @@ public class MessageBrokerBeanDefinitionParserTests {
|
||||
wsHttpRequestHandler.getWebSocketHandler().afterConnectionEstablished(session);
|
||||
assertEquals(true, session.getAttributes().get("decorated"));
|
||||
|
||||
WebSocketHandler wsHandler = unwrapWebSocketHandler(wsHttpRequestHandler.getWebSocketHandler());
|
||||
assertNotNull(wsHandler);
|
||||
WebSocketHandler wsHandler = wsHttpRequestHandler.getWebSocketHandler();
|
||||
assertThat(wsHandler, Matchers.instanceOf(ExceptionWebSocketHandlerDecorator.class));
|
||||
wsHandler = ((ExceptionWebSocketHandlerDecorator) wsHandler).getDelegate();
|
||||
assertThat(wsHandler, Matchers.instanceOf(LoggingWebSocketHandlerDecorator.class));
|
||||
wsHandler = ((LoggingWebSocketHandlerDecorator) wsHandler).getDelegate();
|
||||
assertThat(wsHandler, Matchers.instanceOf(TestWebSocketHandlerDecorator.class));
|
||||
wsHandler = ((TestWebSocketHandlerDecorator) wsHandler).getDelegate();
|
||||
assertThat(wsHandler, Matchers.instanceOf(SubProtocolWebSocketHandler.class));
|
||||
assertSame(wsHandler, this.appContext.getBean(MessageBrokerBeanDefinitionParser.WEB_SOCKET_HANDLER_BEAN_NAME));
|
||||
|
||||
SubProtocolWebSocketHandler subProtocolWsHandler = (SubProtocolWebSocketHandler) wsHandler;
|
||||
assertEquals(Arrays.asList("v10.stomp", "v11.stomp", "v12.stomp"), subProtocolWsHandler.getSubProtocols());
|
||||
@@ -463,12 +478,19 @@ class TestWebSocketHandlerDecoratorFactory implements WebSocketHandlerDecoratorF
|
||||
|
||||
@Override
|
||||
public WebSocketHandler decorate(WebSocketHandler handler) {
|
||||
return new WebSocketHandlerDecorator(handler) {
|
||||
@Override
|
||||
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
|
||||
session.getAttributes().put("decorated", true);
|
||||
super.afterConnectionEstablished(session);
|
||||
}
|
||||
};
|
||||
return new TestWebSocketHandlerDecorator(handler);
|
||||
}
|
||||
}
|
||||
|
||||
class TestWebSocketHandlerDecorator extends WebSocketHandlerDecorator {
|
||||
|
||||
public TestWebSocketHandlerDecorator(WebSocketHandler delegate) {
|
||||
super(delegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
|
||||
session.getAttributes().put("decorated", true);
|
||||
super.afterConnectionEstablished(session);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user