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

Aberta
#1,551 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
42/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
aws, java, spring-boot
Domínio
api, backend, cloud

Direção de pesquisa

Comece pelo ponto de entrada LambdaHandler e pelo GeographicAddressController mostrados na issue e, em seguida, rastreie como o API Gateway request context é exposto aos atributos do controller do Spring. Reproduza a requisição com as versões listadas do Spring Boot e do contêiner; considera-se concluído quando @RequestAttribute recebe o AwsProxyRequestContext, incluindo os detalhes do authorizer, em vez de null.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.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.
Linguagem predominante
Java
Estrelas
1.6k
Forks
575
Merge médio
1d 15h
PRs com merge (30d)
12

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de aws/serverless-java-container

Todas as issues de aws/serverless-java-container

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.