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
相关产品推荐
相关产品推荐

