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

Aperta
#1,551 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
42/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
aws, java, spring-boot
Ambito
api, backend, cloud

Direzione di ricerca

Inizia dal punto di ingresso LambdaHandler e da GeographicAddressController mostrati nell’issue, quindi traccia il modo in cui il API Gateway request context viene esposto agli attributi del controller Spring. Riproduci la richiesta con le versioni di Spring Boot e del container elencate; il lavoro è completato quando @RequestAttribute riceve AwsProxyRequestContext, inclusi i dettagli dell’authorizer, invece di null.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.
Lingua principale
Java
Stelle
1.6k
Fork
575
Merge medio
1g 15h
PR unite (30g)
12

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di aws/serverless-java-container

Tutte le issue di aws/serverless-java-container

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.