Skip to content

Commit b1e4b37

Browse files
authored
Merge pull request #1581 from andreossido/bugfix/aot-initializer-not-found-exception
Fix Spring AotInitializerNotFoundException with AOT
2 parents 96e48e7 + 27d2f8d commit b1e4b37

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
lines changed

aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.slf4j.LoggerFactory;
1919
import org.springframework.boot.WebApplicationType;
2020
import org.springframework.boot.builder.SpringApplicationBuilder;
21-
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
21+
import org.springframework.web.context.ConfigurableWebApplicationContext;
2222
import org.springframework.context.ConfigurableApplicationContext;
2323

2424
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
@@ -184,20 +184,26 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet
184184
Timer.stop("SPRINGBOOT2_HANDLE_REQUEST");
185185
}
186186

187+
SpringApplicationBuilder getSpringApplicationBuilder(Class<?>... sources) {
188+
return new SpringApplicationBuilder(sources);
189+
}
187190

188191
@Override
189192
public void initialize()
190193
throws ContainerInitializationException {
191194
Timer.start("SPRINGBOOT2_COLD_START");
192195

193-
SpringApplicationBuilder builder = new SpringApplicationBuilder(getEmbeddedContainerClasses())
196+
SpringApplicationBuilder builder = getSpringApplicationBuilder(getEmbeddedContainerClasses())
194197
.web(springWebApplicationType); // .REACTIVE, .SERVLET
198+
if(springBootInitializer != null) {
199+
builder.main(springBootInitializer);
200+
}
195201
if (springProfiles != null) {
196202
builder.profiles(springProfiles);
197203
}
198204
applicationContext = builder.run();
199205
if (springWebApplicationType == WebApplicationType.SERVLET) {
200-
((AnnotationConfigServletWebServerApplicationContext)applicationContext).setServletContext(getServletContext());
206+
((ConfigurableWebApplicationContext)applicationContext).setServletContext(getServletContext());
201207
AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME);
202208
if (reg != null) {
203209
reg.setLoadOnStartup(1);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.amazonaws.serverless.proxy.spring;
2+
3+
import static org.junit.jupiter.api.Assertions.assertThrows;
4+
import static org.mockito.ArgumentMatchers.any;
5+
import static org.mockito.Mockito.doAnswer;
6+
import static org.mockito.Mockito.never;
7+
import static org.mockito.Mockito.times;
8+
import static org.mockito.Mockito.verify;
9+
10+
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
11+
import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler;
12+
import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter;
13+
import com.amazonaws.serverless.proxy.InitializationWrapper;
14+
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader;
15+
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
16+
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
17+
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
18+
import com.amazonaws.serverless.proxy.spring.servletapp.ServletApplication;
19+
import com.amazonaws.serverless.proxy.spring.webfluxapp.WebFluxTestApplication;
20+
import java.util.Collection;
21+
import java.util.List;
22+
import org.junit.jupiter.params.ParameterizedTest;
23+
import org.junit.jupiter.params.provider.EnumSource;
24+
import org.junit.jupiter.params.provider.MethodSource;
25+
import org.mockito.Mockito;
26+
import org.springframework.boot.WebApplicationType;
27+
import org.springframework.boot.builder.SpringApplicationBuilder;
28+
29+
class SpringBootLambdaContainerHandlerTest {
30+
31+
SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
32+
SpringApplicationBuilder springApplicationBuilder;
33+
34+
public static Collection<TestData> data() {
35+
return List.of(new TestData(WebApplicationType.SERVLET, ServletApplication.class),
36+
new TestData(WebApplicationType.REACTIVE, WebFluxTestApplication.class));
37+
}
38+
39+
private void initSpringBootLambdaContainerHandlerTest(Class<?> springBootInitializer,
40+
WebApplicationType applicationType) {
41+
handler = Mockito.spy(new SpringBootLambdaContainerHandler<>(AwsProxyRequest.class,
42+
AwsProxyResponse.class,
43+
new AwsProxyHttpServletRequestReader(),
44+
new AwsProxyHttpServletResponseWriter(),
45+
new AwsProxySecurityContextWriter(),
46+
new AwsProxyExceptionHandler(),
47+
springBootInitializer,
48+
new InitializationWrapper(),
49+
applicationType));
50+
51+
doAnswer(d -> {
52+
springApplicationBuilder = ((SpringApplicationBuilder) Mockito.spy(d.callRealMethod()));
53+
return springApplicationBuilder;
54+
}).when(handler).getSpringApplicationBuilder(any(Class[].class));
55+
}
56+
57+
@ParameterizedTest
58+
@MethodSource("data")
59+
void initialize_withSpringBootInitializer(TestData data) throws ContainerInitializationException {
60+
initSpringBootLambdaContainerHandlerTest(data.springBootApplication(), data.applicationType());
61+
handler.initialize();
62+
63+
verify(springApplicationBuilder, times(1)).main(data.springBootApplication());
64+
}
65+
66+
@ParameterizedTest
67+
@EnumSource(WebApplicationType.class)
68+
void initialize_withoutSpringBootInitializer(WebApplicationType webApplicationType) {
69+
initSpringBootLambdaContainerHandlerTest(null, webApplicationType);
70+
assertThrows(IllegalArgumentException.class, handler::initialize, "Source must not be null");
71+
72+
verify(springApplicationBuilder, never()).main(any());
73+
}
74+
75+
record TestData(WebApplicationType applicationType, Class<?> springBootApplication) {}
76+
}

0 commit comments

Comments
 (0)