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

部署在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命令中的&quot;是转义后的双引号,替换为普通双引号避免解析问题:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:07:24