aws / aws/serverless-java-container

com.amazonaws.apigateway.request.context missing in backend @RestController

未关闭
#1,551 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Java
星标
1.6k
派生
574
PR 合并指标
30 天内没有已合并 PR

描述

# 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 handler;

static {
try {
handler = new SpringBootProxyHandlerBuilder()
.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 get(
final @RequestHeader HttpHeaders reqHeaders,
final @RequestParam Map 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.3` application with `aws-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 `requestContext` is always `null`.

贡献指南

打开贡献指南

调研方向

从 issue 中展示的 LambdaHandler 入口点和 GeographicAddressController 开始,然后跟踪 API Gateway request context 如何暴露给 Spring controller 属性。使用列出的 Spring Boot 和容器版本重现该请求;当 @RequestAttribute 接收到包含 authorizer 详细信息的 AwsProxyRequestContext,而不是 null 时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
aws, java, spring-boot
领域
api, backend, cloud
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
42/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。