Skip to content

Commit 760b2a6

Browse files
authored
Merge branch 'main' into sjc-spring-boot-update
2 parents 7f74576 + 9cb2e2f commit 760b2a6

File tree

8 files changed

+97
-6
lines changed

8 files changed

+97
-6
lines changed

.github/workflows/continuous-integration-workflow.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
- 1.x
99
workflow_dispatch:
1010

11+
permissions:
12+
contents: read
13+
1114
jobs:
1215
build_core:
1316
name: Build and test core

.github/workflows/owasp-dependency-check.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ on:
33
schedule:
44
- cron: "10 10 * * 3"
55

6+
permissions:
7+
contents: read
8+
69
jobs:
710
owasp-dependency-check:
811
name: Verify dependencies with OWASP checker

.github/workflows/release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ on:
1010
description: "Version to use for further development"
1111
required: true
1212
default: "X.Y.Z-SNAPSHOT"
13+
permissions:
14+
contents: write
15+
1316
jobs:
1417
release:
1518
runs-on: ubuntu-latest

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+
}

samples/spring/pet-store/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
</licenses>
2525

2626
<properties>
27-
<spring.version>6.2.8</spring.version>
27+
<spring.version>6.2.10</spring.version>
2828
<log4j.version>2.24.3</log4j.version>
2929
<maven.compiler.source>17</maven.compiler.source>
3030
<maven.compiler.target>17</maven.compiler.target>

samples/springboot3/alt-pet-store/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ repositories {
99

1010
dependencies {
1111
implementation (
12-
implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') {
12+
implementation('org.springframework.boot:spring-boot-starter-web:3.5.7') {
1313
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
1414
},
1515
'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)',

samples/springboot3/pet-store-native/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ RUN yum -y update \
88

99
# Graal VM
1010
ENV GRAAL_VERSION 21.0.2
11-
ENV ARCHITECTURE x64
11+
ENV ARCHITECTURE aarch64
1212
ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz
1313
RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz
1414
RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm

0 commit comments

Comments
 (0)