1313package com .amazonaws .serverless .proxy .spring ;
1414
1515import com .amazonaws .serverless .exceptions .ContainerInitializationException ;
16+ import com .amazonaws .serverless .proxy .AwsProxyExceptionHandler ;
1617import com .amazonaws .serverless .proxy .AwsProxySecurityContextWriter ;
1718import com .amazonaws .serverless .proxy .ExceptionHandler ;
1819import com .amazonaws .serverless .proxy .RequestReader ;
1920import com .amazonaws .serverless .proxy .ResponseWriter ;
2021import com .amazonaws .serverless .proxy .SecurityContextWriter ;
21- import com .amazonaws .serverless .proxy .internal .*;
2222import com .amazonaws .serverless .proxy .model .AwsProxyRequest ;
2323import com .amazonaws .serverless .proxy .model .AwsProxyResponse ;
2424import com .amazonaws .serverless .proxy .internal .servlet .*;
2525import com .amazonaws .services .lambda .runtime .Context ;
2626import org .slf4j .Logger ;
2727import org .slf4j .LoggerFactory ;
28+ import org .springframework .core .env .ConfigurableEnvironment ;
29+ import org .springframework .core .env .StandardEnvironment ;
2830import org .springframework .web .SpringServletContainerInitializer ;
2931import org .springframework .web .WebApplicationInitializer ;
3032import org .springframework .web .context .WebApplicationContext ;
3133import org .springframework .web .context .support .WebApplicationContextUtils ;
3234import org .springframework .web .servlet .DispatcherServlet ;
3335
3436import javax .servlet .*;
35- import javax . servlet . http . HttpServletResponse ;
37+
3638import java .util .*;
3739import java .util .concurrent .CountDownLatch ;
3840
4749 * @param <ResponseType> The expected return type
4850 */
4951public class SpringBootLambdaContainerHandler <RequestType , ResponseType > extends AwsLambdaServletContainerHandler <RequestType , ResponseType , AwsProxyHttpServletRequest , AwsHttpServletResponse > {
50- static ThreadLocal <HttpServletResponse > currentResponse = new ThreadLocal <>();
5152 private final Class <? extends WebApplicationInitializer > springBootInitializer ;
5253 private static final Logger log = LoggerFactory .getLogger (SpringBootLambdaContainerHandler .class );
54+ private String [] springProfiles = null ;
5355
5456 // State vars
5557 private boolean initialized ;
@@ -91,6 +93,12 @@ public SpringBootLambdaContainerHandler(RequestReader<RequestType, AwsProxyHttpS
9193 this .springBootInitializer = springBootInitializer ;
9294 }
9395
96+ public void activateSpringProfiles (String ... profiles ) {
97+ springProfiles = profiles ;
98+ // force a re-initialization
99+ initialized = false ;
100+ }
101+
94102 @ Override
95103 protected AwsHttpServletResponse getContainerResponse (AwsProxyHttpServletRequest request , CountDownLatch latch ) {
96104 return new AwsHttpServletResponse (request , latch );
@@ -109,23 +117,23 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt
109117 LinkedHashSet <Class <?>> webAppInitializers = new LinkedHashSet <>();
110118 webAppInitializers .add (springBootInitializer );
111119 springServletContainerInitializer .onStartup (webAppInitializers , getServletContext ());
120+
121+ if (springProfiles != null && springProfiles .length > 0 ) {
122+ ConfigurableEnvironment springEnv = new StandardEnvironment ();
123+ springEnv .setActiveProfiles (springProfiles );
124+
125+ }
126+
112127 initialized = true ;
113128 }
114129
115130 containerRequest .setServletContext (getServletContext ());
116131
117- currentResponse .set (containerResponse );
118- try {
119- WebApplicationContext applicationContext = WebApplicationContextUtils .getRequiredWebApplicationContext (getServletContext ());
120- DispatcherServlet dispatcherServlet = applicationContext .getBean ("dispatcherServlet" , DispatcherServlet .class );
121- // process filters & invoke servlet
122- log .debug ("Process filters & invoke servlet: {}" , dispatcherServlet );
123- doFilter (containerRequest , containerResponse , dispatcherServlet );
124- } finally {
125- // call the flush method to release the latch
126- SpringBootLambdaContainerHandler .currentResponse .remove ();
127- currentResponse .remove ();
128- }
132+ WebApplicationContext applicationContext = WebApplicationContextUtils .getRequiredWebApplicationContext (getServletContext ());
133+
134+ DispatcherServlet dispatcherServlet = applicationContext .getBean ("dispatcherServlet" , DispatcherServlet .class );
135+ // process filters & invoke servlet
136+ doFilter (containerRequest , containerResponse , dispatcherServlet );
129137 }
130138
131139 private class SpringBootAwsServletContext extends AwsServletContext {
0 commit comments