部署在LocalStack的Quarkus原生Lambda始终接收null的InputObject
问题原因与解决方案
核心问题:Lambda函数URL的请求结构差异
当通过Lambda函数URL调用时,AWS(包括LocalStack)不会直接将你的JSON payload传递给RequestHandler的输入参数,而是将请求包装在一个包含body、headers、requestContext等字段的标准Lambda请求对象中。你的代码直接接收InputObject,自然无法解析到传入的JSON数据,导致字段为null。
解决方案步骤
1. 新增Lambda请求包装类
创建一个用于接收函数URL请求的包装类,提取其中的body字段:
package it.example.quarkusnativelambdatemplate; import lombok.Getter; import lombok.Setter; @Setter @Getter public class LambdaRequest { private String body; }
2. 修改Handler解析请求体
更新TemplateLambda,通过Jackson解析请求体中的JSON到InputObject:
package it.example.quarkusnativelambdatemplate; import jakarta.inject.Named; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.inject.Inject; import lombok.extern.slf4j.Slf4j; @Named("template-lambda") @Slf4j public class TemplateLambda implements RequestHandler<LambdaRequest, OutputObject> { @Inject ObjectMapper objectMapper; @Override public OutputObject handleRequest(LambdaRequest request, Context context) { try { InputObject input = objectMapper.readValue(request.getBody(), InputObject.class); log.debug("[TemplateLambda.handleRequest] [input.name = {} | input.greeting = {}]", input.getName(), input.getGreeting()); OutputObject outputObject = new OutputObject(); outputObject.setResult(String.format("%s %s", input.getGreeting(), input.getName())); return outputObject; } catch (JsonProcessingException e) { log.error("Failed to parse input payload", e); // 可根据需求返回错误响应 OutputObject errorOutput = new OutputObject(); errorOutput.setResult("Invalid input format"); return errorOutput; } } }
3. 适配Native镜像的反射配置
由于你使用的是Quarkus Native模式,Jackson需要明确知道要序列化/反序列化的类,否则会因反射限制无法解析。给实体类添加@RegisterForReflection注解:
package it.example.quarkusnativelambdatemplate; import lombok.Getter; import lombok.Setter; import io.quarkus.runtime.annotations.RegisterForReflection; @Setter @Getter @RegisterForReflection public class InputObject { private String name; private String greeting; }
package it.example.quarkusnativelambdatemplate; import lombok.Getter; import lombok.Setter; import io.quarkus.runtime.annotations.RegisterForReflection; @Setter @Getter @RegisterForReflection public class LambdaRequest { private String body; }
4. 修正curl请求格式
原curl命令中的"是转义后的双引号,替换为普通双引号避免解析问题:
curl --location 'http://yfer9nmb4svqec0fv06ldtj1sfr55la6.lambda-url.us-east-1.localhost.localstack.cloud:4566' \ --header 'Content-Type: application/json' \ --data '{ "name": "Francesco", "greeting": "Ciao" }'
内容的提问来源于stack exchange,提问作者framilano
相关产品推荐
相关产品推荐

