From e0a80c287c5aa31ef863e5d35aaf721bb91c141f Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 24 Mar 2017 21:58:59 +0000 Subject: [PATCH] Remove Tomcat 7.0 and 8.0-based WebSocket support Closes gh-8615 --- spring-boot-autoconfigure/pom.xml | 10 ++-- .../TomcatWebSocketContainerCustomizer.java | 48 +------------------ 2 files changed, 7 insertions(+), 51 deletions(-) diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml index 84f77dccab..f18f52d553 100755 --- a/spring-boot-autoconfigure/pom.xml +++ b/spring-boot-autoconfigure/pom.xml @@ -219,6 +219,11 @@ tomcat-embed-el true + + org.apache.tomcat.embed + tomcat-embed-websocket + true + org.apache.tomcat tomcat-jdbc @@ -706,11 +711,6 @@ mysql-connector-java test - - org.apache.tomcat.embed - tomcat-embed-websocket - test - org.hsqldb hsqldb diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/websocket/TomcatWebSocketContainerCustomizer.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/websocket/TomcatWebSocketContainerCustomizer.java index e5cfff5b31..fdb80908a0 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/websocket/TomcatWebSocketContainerCustomizer.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/websocket/TomcatWebSocketContainerCustomizer.java @@ -16,17 +16,13 @@ package org.springframework.boot.autoconfigure.websocket; -import java.lang.reflect.Constructor; - import org.apache.catalina.Context; +import org.apache.tomcat.websocket.server.WsContextListener; -import org.springframework.beans.BeanUtils; import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.core.Ordered; -import org.springframework.util.ClassUtils; -import org.springframework.util.ReflectionUtils; /** * WebSocket customizer for {@link TomcatServletWebServerFactory}. @@ -39,58 +35,18 @@ import org.springframework.util.ReflectionUtils; public class TomcatWebSocketContainerCustomizer implements WebServerFactoryCustomizer, Ordered { - private static final String TOMCAT_7_LISTENER_TYPE = "org.apache.catalina.deploy.ApplicationListener"; - - private static final String TOMCAT_8_LISTENER_TYPE = "org.apache.tomcat.util.descriptor.web.ApplicationListener"; - - private static final String WS_LISTENER = "org.apache.tomcat.websocket.server.WsContextListener"; - @Override public void customize(TomcatServletWebServerFactory factory) { factory.addContextCustomizers(new TomcatContextCustomizer() { @Override public void customize(Context context) { - addListener(context, findListenerType()); + context.addApplicationListener(WsContextListener.class.getName()); } }); } - private Class findListenerType() { - if (ClassUtils.isPresent(TOMCAT_7_LISTENER_TYPE, null)) { - return ClassUtils.resolveClassName(TOMCAT_7_LISTENER_TYPE, null); - } - if (ClassUtils.isPresent(TOMCAT_8_LISTENER_TYPE, null)) { - return ClassUtils.resolveClassName(TOMCAT_8_LISTENER_TYPE, null); - } - // With Tomcat 8.0.8 ApplicationListener is not required - return null; - } - - /** - * Instead of registering directly as a ServletContainerInitializer, we use the - * ApplicationListener provided by Tomcat. Unfortunately the ApplicationListener class - * moved packages in Tomcat 8 and been deleted in 8.0.8 so we have to use reflection. - * @param context the current context - * @param listenerType the type of listener to add - */ - private void addListener(Context context, Class listenerType) { - Class contextClass = context.getClass(); - if (listenerType == null) { - ReflectionUtils.invokeMethod(ClassUtils.getMethod(contextClass, - "addApplicationListener", String.class), context, WS_LISTENER); - - } - else { - Constructor constructor = ClassUtils - .getConstructorIfAvailable(listenerType, String.class, boolean.class); - Object instance = BeanUtils.instantiateClass(constructor, WS_LISTENER, false); - ReflectionUtils.invokeMethod(ClassUtils.getMethod(contextClass, - "addApplicationListener", listenerType), context, instance); - } - } - @Override public int getOrder() { return 0;