From bc8f548eb00c44b3bc41b5f1af6677ae48ae0784 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 12 Nov 2024 22:35:54 +0100 Subject: [PATCH 1/3] fix: null ServletContext returned (see https://github.com/aws/serverless-java-container/issues/1087) --- .../cloud/function/serverless/web/ServerlessMVC.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java index 486794734..5017ac09a 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java @@ -78,8 +78,6 @@ public final class ServerlessMVC { private volatile ServletWebServerApplicationContext applicationContext; - private ServletContext servletContext; - private final CountDownLatch contextStartupLatch = new CountDownLatch(1); private final long initializatioinTimeout; @@ -137,7 +135,7 @@ public ConfigurableWebApplicationContext getApplicationContext() { public ServletContext getServletContext() { this.waitForContext(); - return this.servletContext; + return this.dispatcher.getServletContext(); } public void stop() { From 0903e9cfb81fe240b7b0562f06cdb632c4968614 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 12 Nov 2024 22:40:41 +0100 Subject: [PATCH 2/3] polishing --- .../cloud/function/serverless/web/ServerlessMVC.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java index 5017ac09a..0908621b6 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java @@ -80,7 +80,7 @@ public final class ServerlessMVC { private final CountDownLatch contextStartupLatch = new CountDownLatch(1); - private final long initializatioinTimeout; + private final long initializationTimeout; public static ServerlessMVC INSTANCE(Class... componentClasses) { ServerlessMVC mvc = new ServerlessMVC(); @@ -101,7 +101,7 @@ private ServerlessMVC() { if (!StringUtils.hasText(timeoutValue)) { timeoutValue = System.getProperty(INIT_TIMEOUT); } - this.initializatioinTimeout = StringUtils.hasText(timeoutValue) ? Long.valueOf(timeoutValue) : 20000; + this.initializationTimeout = StringUtils.hasText(timeoutValue) ? Long.valueOf(timeoutValue) : 20000; } private void initializeContextAsync(Class... componentClasses) { @@ -155,7 +155,7 @@ public void stop() { * @see org.springframework.test.web.servlet.result.MockMvcResultMatchers */ public void service(HttpServletRequest request, HttpServletResponse response) throws Exception { - Assert.state(this.waitForContext(), "Failed to initialize Application within the specified time of " + this.initializatioinTimeout + " milliseconds. " + Assert.state(this.waitForContext(), "Failed to initialize Application within the specified time of " + this.initializationTimeout + " milliseconds. " + "If you need to increase it, please set " + INIT_TIMEOUT + " environment variable"); this.service(request, response, (CountDownLatch) null); } @@ -187,7 +187,7 @@ public void service(HttpServletRequest request, HttpServletResponse response, Co public boolean waitForContext() { try { - return contextStartupLatch.await(initializatioinTimeout, TimeUnit.MILLISECONDS); + return contextStartupLatch.await(initializationTimeout, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -213,7 +213,6 @@ private static class ProxyFilterChain implements FilterChain { * Create a {@code FilterChain} with Filter's and a Servlet. * * @param servlet the {@link Servlet} to invoke in this {@link FilterChain} - * @param filters the {@link Filter}'s to invoke in this {@link FilterChain} * @since 4.0.x */ ProxyFilterChain(DispatcherServlet servlet) { From af1aea36939ab4dabecc55a6997b85d5a48e38af Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 13 Nov 2024 06:15:54 +0100 Subject: [PATCH 3/3] implement getMimeType so AbstractMessageConverterMethodProcessor.resolveMediaType doesn't fail with UnsupportedOperationException --- .../serverless/web/ServerlessServletContext.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java index 921c5941f..3c449196a 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java @@ -16,9 +16,13 @@ package org.springframework.cloud.function.serverless.web; +import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; @@ -104,7 +108,14 @@ public int getEffectiveMinorVersion() { @Override public String getMimeType(String file) { - throw new UnsupportedOperationException("This ServletContext does not represent a running web container"); + String mimeType = null; + try { + mimeType = Files.probeContentType(Paths.get(file)); + } + catch (IOException | InvalidPathException e) { + log("unable to probe for content type " + file, e); + } + return mimeType; } @Override