You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中AwsProxyRequest上下文的Authorizer未正确设置问题

问题分析与解决方案

你的问题核心在于两次HTTP请求完全独立:向/_lambda_发送的AwsProxyRequest上下文不会被后续的/documents请求继承。直接用RestAssured调用JAX-RS端点时,Quarkus默认按普通HTTP请求处理,不会自动填充AwsProxyRequest中的Lambda特定上下文(比如authorizer),导致注入的对象中authorizer为null。

以下是两种可行的解决方案:


方案一:直接调用Lambda处理程序

绕过HTTP模拟,直接构造AwsProxyRequest并调用你的Lambda处理类,确保上下文完整传递:

@QuarkusTest
public class Test {

    @Inject
    LambdaHandler lambdaHandler; // 替换为你的Lambda处理类(实现RequestHandler<AwsProxyRequest, AwsProxyResponse>)

    @Test
    public void test() throws IOException {
        // 构造带authorizer的Lambda请求
        AwsProxyRequest awsProxyRequest = new AwsProxyRequest();
        AwsProxyRequestContext requestContext = new AwsProxyRequestContext();
        ApiGatewayAuthorizerContext authorizer = new ApiGatewayAuthorizerContext();
        authorizer.setContextValue("item", "[\"TestEditor\"]");
        requestContext.setAuthorizer(authorizer);
        awsProxyRequest.setRequestContext(requestContext);
        
        // 设置请求路径、方法和头部
        awsProxyRequest.setHttpMethod("POST");
        awsProxyRequest.setPath("/documents");
        awsProxyRequest.setHeaders(Map.of(
            "Content-Type", "application/xml",
            "Accept", "application/xml"
        ));
        
        // 读取请求体
        File document = new File("src/test/resources/document.xml");
        String body = new String(Files.readAllBytes(document.toPath()), StandardCharsets.UTF_8);
        awsProxyRequest.setBody(body);

        // 调用Lambda处理逻辑
        AwsProxyResponse response = lambdaHandler.handleRequest(awsProxyRequest, null);
        
        // 验证响应状态码
        assertEquals(Response.Status.NO_CONTENT.getStatusCode(), Integer.parseInt(response.getStatusCode()));
    }
}

方案二:在RestAssured请求中注入Lambda上下文

通过Quarkus的请求属性机制,手动将构造好的AwsProxyRequest注入到RestAssured请求中:

@QuarkusTest
public class Test {

    @Test
    public void test() throws IOException {
        // 构造带authorizer的Lambda请求上下文
        AwsProxyRequest awsProxyRequest = new AwsProxyRequest();
        AwsProxyRequestContext requestContext = new AwsProxyRequestContext();
        ApiGatewayAuthorizerContext authorizer = new ApiGatewayAuthorizerContext();
        authorizer.setContextValue("item", "[\"TestEditor\"]");
        requestContext.setAuthorizer(authorizer);
        awsProxyRequest.setRequestContext(requestContext);

        // 读取请求体
        File document = new File("src/test/resources/document.xml");
        String body = new String(Files.readAllBytes(document.toPath()), StandardCharsets.UTF_8);

        given()
                .request().attribute(AwsProxyRequest.class.getName(), awsProxyRequest) // 注入Lambda上下文
                .body(body)
                .contentType(ContentType.XML)
                .accept(ContentType.XML)
                .when()
                .post("/documents")
                .then()
                .statusCode(Response.Status.NO_CONTENT.getStatusCode());
    }
}

额外检查

确保你的项目已正确引入Quarkus Amazon Lambda HTTP扩展依赖(如Maven的quarkus-amazon-lambda-http),且Lambda处理类配置正确。

内容的提问来源于stack exchange,提问作者PetruC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:43:25