mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-07-15 01:07:30 +08:00
Merge branch '3.2.x' into 3.3.x
Closes gh-41225
This commit is contained in:
commit
6d0c68f9f6
@ -38,7 +38,8 @@ class JettyEmbeddedWebAppContext extends WebAppContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void deferredInitialize() throws Exception {
|
void deferredInitialize() throws Exception {
|
||||||
((JettyEmbeddedServletHandler) getServletHandler()).deferredInitialize();
|
JettyEmbeddedServletHandler handler = (JettyEmbeddedServletHandler) getServletHandler();
|
||||||
|
getContext().call(handler::deferredInitialize, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class JettyEmbeddedServletHandler extends ServletHandler {
|
private static final class JettyEmbeddedServletHandler extends ServletHandler {
|
||||||
|
@ -40,6 +40,7 @@ import java.util.Collection;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -65,6 +66,7 @@ import jakarta.servlet.Filter;
|
|||||||
import jakarta.servlet.FilterChain;
|
import jakarta.servlet.FilterChain;
|
||||||
import jakarta.servlet.FilterConfig;
|
import jakarta.servlet.FilterConfig;
|
||||||
import jakarta.servlet.GenericServlet;
|
import jakarta.servlet.GenericServlet;
|
||||||
|
import jakarta.servlet.ServletConfig;
|
||||||
import jakarta.servlet.ServletContext;
|
import jakarta.servlet.ServletContext;
|
||||||
import jakarta.servlet.ServletContextEvent;
|
import jakarta.servlet.ServletContextEvent;
|
||||||
import jakarta.servlet.ServletContextListener;
|
import jakarta.servlet.ServletContextListener;
|
||||||
@ -1366,6 +1368,26 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||||||
+ " \\(http(/1.1)?\\), [0-9]+ \\(http(/1.1)?\\) with context path '/'");
|
+ " \\(http(/1.1)?\\), [0-9]+ \\(http(/1.1)?\\) with context path '/'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void servletComponentsAreInitializedWithTheSameThreadContextClassLoader() {
|
||||||
|
AbstractServletWebServerFactory factory = getFactory();
|
||||||
|
ThreadContextClassLoaderCapturingServlet servlet = new ThreadContextClassLoaderCapturingServlet();
|
||||||
|
ThreadContextClassLoaderCapturingFilter filter = new ThreadContextClassLoaderCapturingFilter();
|
||||||
|
ThreadContextClassLoaderCapturingListener listener = new ThreadContextClassLoaderCapturingListener();
|
||||||
|
this.webServer = factory.getWebServer((context) -> {
|
||||||
|
context.addServlet("tcclCapturingServlet", servlet).setLoadOnStartup(0);
|
||||||
|
context.addFilter("tcclCapturingFilter", filter);
|
||||||
|
context.addListener(listener);
|
||||||
|
});
|
||||||
|
this.webServer.start();
|
||||||
|
assertThat(servlet.contextClassLoader).isNotNull();
|
||||||
|
assertThat(filter.contextClassLoader).isNotNull();
|
||||||
|
assertThat(listener.contextClassLoader).isNotNull();
|
||||||
|
assertThat(new HashSet<>(
|
||||||
|
Arrays.asList(servlet.contextClassLoader, filter.contextClassLoader, listener.contextClassLoader)))
|
||||||
|
.hasSize(1);
|
||||||
|
}
|
||||||
|
|
||||||
protected Future<Object> initiateGetRequest(int port, String path) {
|
protected Future<Object> initiateGetRequest(int port, String path) {
|
||||||
return initiateGetRequest(HttpClients.createMinimal(), port, path);
|
return initiateGetRequest(HttpClients.createMinimal(), port, path);
|
||||||
}
|
}
|
||||||
@ -1822,4 +1844,43 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class ThreadContextClassLoaderCapturingServlet extends HttpServlet {
|
||||||
|
|
||||||
|
private ClassLoader contextClassLoader;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(ServletConfig config) throws ServletException {
|
||||||
|
this.contextClassLoader = Thread.currentThread().getContextClassLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ThreadContextClassLoaderCapturingListener implements ServletContextListener {
|
||||||
|
|
||||||
|
private ClassLoader contextClassLoader;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextInitialized(ServletContextEvent sce) {
|
||||||
|
this.contextClassLoader = Thread.currentThread().getContextClassLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ThreadContextClassLoaderCapturingFilter implements Filter {
|
||||||
|
|
||||||
|
private ClassLoader contextClassLoader;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException {
|
||||||
|
this.contextClassLoader = Thread.currentThread().getContextClassLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||||
|
throws IOException, ServletException {
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user