Skip to content

Commit e083683

Browse files
committed
Update WebSocket support for Jetty 9.3
Issue: SPR-13140
1 parent 25ff34f commit e083683

15 files changed

+504
-348
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ configure(allprojects) { project ->
4646
ext.jackson2Version = "2.6.0-rc2" // to be upgraded to 2.6 final in time for Spring Framework 4.2 GA
4747
ext.jasperreportsVersion = "6.1.0"
4848
ext.javamailVersion = "1.5.3"
49-
ext.jettyVersion = "9.2.11.v20150529"
49+
ext.jettyVersion = "9.3.0.v20150612"
5050
ext.jodaVersion = "2.8.1"
5151
ext.jrubyVersion = "1.7.20"
5252
ext.jtaVersion = "1.2"

spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
import org.springframework.beans.factory.xml.ParserContext;
3434
import org.springframework.util.StringUtils;
3535
import org.springframework.util.xml.DomUtils;
36-
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
3736
import org.springframework.web.socket.server.support.OriginHandshakeInterceptor;
37+
import org.springframework.web.socket.server.support.WebSocketHandlerMapping;
3838
import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler;
3939
import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
4040

@@ -64,7 +64,7 @@ public BeanDefinition parse(Element element, ParserContext context) {
6464
String orderAttribute = element.getAttribute("order");
6565
int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute);
6666

67-
RootBeanDefinition handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class);
67+
RootBeanDefinition handlerMappingDef = new RootBeanDefinition(WebSocketHandlerMapping.class);
6868
handlerMappingDef.setSource(source);
6969
handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
7070
handlerMappingDef.getPropertyValues().add("order", order);

spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/ServletWebSocketHandlerRegistry.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
3030
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
3131
import org.springframework.web.socket.WebSocketHandler;
32+
import org.springframework.web.socket.server.support.WebSocketHandlerMapping;
3233
import org.springframework.web.util.UrlPathHelper;
3334

3435
/**
@@ -101,7 +102,7 @@ public AbstractHandlerMapping getHandlerMapping() {
101102
}
102103
}
103104
}
104-
SimpleUrlHandlerMapping hm = new SimpleUrlHandlerMapping();
105+
WebSocketHandlerMapping hm = new WebSocketHandlerMapping();
105106
hm.setUrlMap(urlMap);
106107
hm.setOrder(this.order);
107108
if (this.urlPathHelper != null) {

spring-websocket/src/main/java/org/springframework/web/socket/server/jetty/JettyRequestUpgradeStrategy.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
package org.springframework.web.socket.server.jetty;
1818

1919
import java.io.IOException;
20+
import java.lang.reflect.Method;
2021
import java.security.Principal;
2122
import java.util.ArrayList;
2223
import java.util.List;
2324
import java.util.Map;
2425

26+
import javax.servlet.ServletContext;
2527
import javax.servlet.http.HttpServletRequest;
2628
import javax.servlet.http.HttpServletResponse;
2729

@@ -42,7 +44,9 @@
4244
import org.springframework.http.server.ServletServerHttpRequest;
4345
import org.springframework.http.server.ServletServerHttpResponse;
4446
import org.springframework.util.Assert;
47+
import org.springframework.util.ClassUtils;
4548
import org.springframework.util.CollectionUtils;
49+
import org.springframework.web.context.ServletContextAware;
4650
import org.springframework.web.socket.WebSocketExtension;
4751
import org.springframework.web.socket.WebSocketHandler;
4852
import org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter;
@@ -59,7 +63,11 @@
5963
* @author Rossen Stoyanchev
6064
* @since 4.0
6165
*/
62-
public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Lifecycle {
66+
public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Lifecycle, ServletContextAware {
67+
68+
// Pre-Jetty 9.3 init method without ServletContext
69+
private static final Method webSocketFactoryInitMethod =
70+
ClassUtils.getMethodIfAvailable(WebSocketServerFactory.class, "init");
6371

6472
private static final ThreadLocal<WebSocketHandlerContainer> wsContainerHolder =
6573
new NamedThreadLocal<WebSocketHandlerContainer>("WebSocket Handler Container");
@@ -69,6 +77,8 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Life
6977

7078
private volatile List<WebSocketExtension> supportedExtensions;
7179

80+
private ServletContext servletContext;
81+
7282
private volatile boolean running = false;
7383

7484

@@ -94,7 +104,6 @@ public Object createWebSocket(ServletUpgradeRequest request, ServletUpgradeRespo
94104
// Cast to avoid infinite recursion
95105
return createWebSocket((UpgradeRequest) request, (UpgradeResponse) response);
96106
}
97-
98107
// For Jetty 9.0.x
99108
public Object createWebSocket(UpgradeRequest request, UpgradeResponse response) {
100109
WebSocketHandlerContainer container = wsContainerHolder.get();
@@ -128,6 +137,11 @@ private List<WebSocketExtension> getWebSocketExtensions() {
128137
return result;
129138
}
130139

140+
@Override
141+
public void setServletContext(ServletContext servletContext) {
142+
this.servletContext = servletContext;
143+
}
144+
131145
@Override
132146
public boolean isRunning() {
133147
return this.running;
@@ -139,7 +153,12 @@ public void start() {
139153
if (!isRunning()) {
140154
this.running = true;
141155
try {
142-
this.factory.init();
156+
if (webSocketFactoryInitMethod != null) {
157+
webSocketFactoryInitMethod.invoke(this.factory);
158+
}
159+
else {
160+
this.factory.init(this.servletContext);
161+
}
143162
}
144163
catch (Exception ex) {
145164
throw new IllegalStateException("Unable to initialize Jetty WebSocketServerFactory", ex);

0 commit comments

Comments
 (0)