From 1fff631daa65c228a1e2caeb387d1b8cd6b6e2e8 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 3 Nov 2014 14:25:27 +0100 Subject: [PATCH] Fix SubProtocolHandler duplicate registration Prior to this change, duplicate SubProtocolHandlers could be registered when configuring STOMP with several registrations: public void registerStompEndpoints (final StompEndpointRegistry registry) { this.endpointRegistry.addEndpoint("/stompOverWebSocket"); this.endpointRegistry.addEndpoint("/stompOverSockJS").withSockJS(); } This commit registers sub-protocols in a Set instead of a list (see SubProtocolWebSocketHandler), thus fixing the issue. Issue: SPR-12403 --- .../web/socket/messaging/SubProtocolWebSocketHandler.java | 8 +++++--- .../annotation/WebMvcStompEndpointRegistryTests.java | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolWebSocketHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolWebSocketHandler.java index 21bc2fd183..6e80e7c0e1 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolWebSocketHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolWebSocketHandler.java @@ -19,8 +19,10 @@ package org.springframework.web.socket.messaging; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -86,7 +88,7 @@ public class SubProtocolWebSocketHandler implements WebSocketHandler, private final Map protocolHandlerLookup = new TreeMap(String.CASE_INSENSITIVE_ORDER); - private final List protocolHandlers = new ArrayList(); + private final Set protocolHandlers = new HashSet(); private SubProtocolHandler defaultProtocolHandler; @@ -129,7 +131,7 @@ public class SubProtocolWebSocketHandler implements WebSocketHandler, } public List getProtocolHandlers() { - return new ArrayList(this.protocolHandlerLookup.values()); + return new ArrayList(this.protocolHandlers); } @@ -288,7 +290,7 @@ public class SubProtocolWebSocketHandler implements WebSocketHandler, handler = this.defaultProtocolHandler; } else if (this.protocolHandlers.size() == 1) { - handler = this.protocolHandlers.get(0); + handler = this.protocolHandlers.iterator().next(); } else { throw new IllegalStateException("Multiple protocol handlers configured and " + diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistryTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistryTests.java index 77f93e0730..604303df73 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistryTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistryTests.java @@ -84,6 +84,9 @@ public class WebMvcStompEndpointRegistryTests { this.endpointRegistry.addEndpoint("/stompOverWebSocket"); this.endpointRegistry.addEndpoint("/stompOverSockJS").withSockJS(); + //SPR-12403 + assertEquals(1, this.webSocketHandler.getProtocolHandlers().size()); + hm = (SimpleUrlHandlerMapping) this.endpointRegistry.getHandlerMapping(); assertEquals(2, hm.getUrlMap().size()); assertNotNull(hm.getUrlMap().get("/stompOverWebSocket"));