-
Notifications
You must be signed in to change notification settings - Fork 571
Description
Issue: com.amazonaws.apigateway.request.context missing in backend @RestController
To help us debug your issue fill in the basic information below using the options provided
Serverless Java Container version: 2.1.4
Implementations: Spring Boot 3
Framework version: SpringBoot 3.5.3
Frontend service: REST API / API Gateway Proxy Request
Deployment method: SAM
Description
When using Spring Boot 3.5.3 with aws-serverless-java-container-springboot3:2.1.4,
the AwsProxyRequestContext is not being injected into a controller method when annotated with:
@RequestAttribute("com.amazonaws.apigateway.request.context")
This attribute is expected to contain the API Gateway request context, but instead it is always null.
Lambda Handler
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class LambdaHandler implements RequestStreamHandler {
private static final SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
static {
try {
handler = new SpringBootProxyHandlerBuilder<AwsProxyRequest>()
.defaultProxy()
.initializationWrapper(new InitializationWrapper())
.springBootApplication(Application.class)
.buildAndInitialize();
} catch (ContainerInitializationException e) {
throw new LambdaException("Could not initialize Lambda. ", e);
}
}
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
handler.proxyStream(inputStream, outputStream, context);
}
}
Controller
import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
public class GeographicAddressController {
private static final String API_GATEWAY_CONTEXT_PROPERTY = "com.amazonaws.apigateway.request.context";
@GetMapping(path = "/geographicAddress", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> get(
final @RequestHeader HttpHeaders reqHeaders,
final @RequestParam Map<String, String> params,
final @RequestAttribute(value = API_GATEWAY_CONTEXT_PROPERTY, required = false) AwsProxyRequestContext requestContext
) {
// requestContext is always null, I would like to get AwsProxyRequestContext , and authorizer details
return ResponseEntity.ok().build();
}
}
Expected Behavior
The requestContext parameter should be populated with the AwsProxyRequestContext extracted from the incoming API Gateway event.
Actual Behavior
requestContext is always null inside the controller method.
Steps to Reproduce
- Deploy a
Spring Boot 3.5.3application withaws-serverless-java-container-springboot3:2.1.4. - Use the Lambda handler shown above.
- Add a controller method with
@RequestAttribute("com.amazonaws.apigateway.request.context"). - Invoke the API Gateway endpoint.
- Observe that
requestContextis alwaysnull.