如何为 SpringBoot ApiGateway RequestHandler 应用 Spring Cloud Functions "Functional Bean Registration"

How to apply Spring Cloud Function's "Functional Bean Registration" for SpringBootApiGatewayRequestHandler

我正在尝试部署使用 Spring Cloud Function 2.1.0 编写的 AWS Lambda 函数,该函数接收 API 网关事件。因此我设置了如下所示的 ApplicationContextInitializer 以及 SpringBootApiGatewayRequestHandler。不幸的是我 运行 进入了异常:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance oforg.springframework.messaging.Message(no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

我查看了 spring-cloud-functions 测试用例和示例,但找不到具有 Message parameter/return 值的功能 Bean 注册示例。

@SpringBootConfiguration
public class ServiceConfiguration implements ApplicationContextInitializer<GenericApplicationContext> {

    public static void main(String[] args) {
        FunctionalSpringApplication.run(ServiceConfiguration.class, args);
    }

    public Function<Message<Pojo>,Message<Pojo>> transformMessage() {
        return request -> new GenericMessage<>(new Pojo(request.getPayload().getValue().toUpperCase()));
    }

    @Override
    public void initialize(GenericApplicationContext applicationContext) {
        applicationContext
                .registerBean("transformMessage", FunctionRegistration.class,
                        () -> new FunctionRegistration<>(transformMessage())
                                .type(FunctionType.from(Message.class).to(Message.class)));
    }

}
public class TransformMessageHandler extends SpringBootApiGatewayRequestHandler {
}

有人可以向我指出一个工作示例或提示如何正确注册吗?

从规范中我看到 SpringBootApiGatewayRequestHandler extends SpringBootRequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent>
而不是你的函数返回接收和返回 Message 对象,它应该与 APIGatewayProxyRequestEventAPIGatewayResponseEvent.

一起工作

表示您的函数逻辑的方法将具有如下签名:
public Function<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> transform()

初始化期间的注册如下所示:

@Override
public void initialize(GenericApplicationContext applicationContext) {
    applicationContext
            .registerBean("transform", FunctionRegistration.class,
                    () -> new FunctionRegistration<>(transform())
                            .type(FunctionType.from(APIGatewayProxyRequestEvent.class).to(APIGatewayProxyResponseEvent.class)));
}