我正在尝试使用 Java + Dagger 创建一些基本的 lambda 来处理 API 网关请求。
我正在尝试使用 Dagger 注入不同函数所需的 AWS 客户端,但正在努力获取实际的 lambda 调用来调用默认构造函数。
我有
@Singleton
@Component(modules = {HandlerCommonModule.class})
public interface LambdaHandlers {
CreateRecord createRecord();
DeleteRecord DeleteRecord();
}
和
@Module
public class HandlerCommonModule {
@Provides
@Singleton
public static DynamoDbClient dynamoDbClient() {
return DynamoDbClient.builder().build();
}
}
然后处理程序类之一看起来像
public class CreateRecord extends BaseHandler {
private static final Logger log = LogManager.getLogger(CreateRecord.class);
@NonNull
DynamoDbClient dynamoDbClient;
@Inject
public CreateRecord(final DynamoDbClient dynamoDbClient) {
this.dynamoDbClient = dynamoDbClient;
}
@Override
public BaseResponse process(BaseRequest request, Context context) {
log.info("...");
}
}
它正在扩展一个基本处理程序,我希望最终能够解开 API 网关请求,并将请求特定形状传递给处理程序(相应的 CreateRecordRequest 和 DeleteRecordRequest)
public abstract class BaseHandler implements RequestHandler<BaseRequest, BaseResponse> {
private static final Logger LOGGER = LogManager.getLogger(BaseHandler.class);
protected abstract BaseResponse process(BaseRequest request, Context context);
@Override
public final BaseResponse handleRequest(BaseRequest request, Context context) {
try {
return process(request, context);
} catch (Exception e) {
LOGGER.debug("Exception: {e}", e);
}
return defaultErrorResponse();
}
protected BaseResponse defaultErrorResponse() {
return BaseResponse.builder()
.statusCode(503)
.body("Service unavailable. Try again later.")
.build();
}
}
Lambda 声称类没有无参数构造函数,这是事实。查看类构建,我发现 Dagger 在 LambdaHandlers 中创建,但我不确定如何使用它或需要更改哪些内容来创建 aws lambda 可以使用的默认构造函数。到目前为止,我发现的所有示例似乎都相当微不足道,或者假设只有一个 lambda。我正在尝试创建多个 API,并希望根据需要重用一些逻辑/注入一些 AWS 客户端。提前谢谢!
所以,上面的模式似乎是正确的。
就我而言,我的问题是由 lambda 代码版本与 lambda 正在执行的内容引起的。哎呀!
清理所有资源并重新部署并全面实施,效果符合预期。