2

我是 Spring Cloud Function 的新手,并将其视为开发基于 FaaS 的解决方案的最佳解决方案之一。我正在专门为 API Gateway 后端的 AWS Lambda 服务编写应用程序。我的测试应用程序遇到了一个非常有趣的问题,它在处理程序周围。我的测试应用程序与编写为的自定义处理程序配合得很好 -

public class UserProfileHandler extends SpringBootRequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
}

在 AWS Lambda 中配置为处理程序时效果很好。然后我遇到org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler了 Spring Cloud Function 依赖项中可用的内容,所以我想摆脱,UserProfileHandler因此我将 AWS Lambda 中的 Handler 配置更改为,org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler而不是...UserProfileHandler现在 lambda 失败并显示以下错误消息。有没有人遇到过这个问题?

{
  "errorMessage": "java.util.Optional cannot be cast to com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent",
  "errorType": "java.lang.ClassCastException",
  "stackTrace": [
    "com.transformco.hs.css.userprofile.function.UserProfileFunction.apply(UserProfileFunction.java:16)",
    "org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry$FunctionInvocationWrapper.invokeFunction(BeanFactoryAwareFunctionRegistry.java:499)",
    "org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry$FunctionInvocationWrapper.lambda$doApply$1(BeanFactoryAwareFunctionRegistry.java:543)",
    "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)",
    "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)",
    "reactor.core.publisher.FluxJust$WeakScalarSubscription.request(FluxJust.java:99)",
    "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162)",
    "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162)",
    "reactor.core.publisher.BlockingIterable$SubscriberIterator.onSubscribe(BlockingIterable.java:218)",
    "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)",
    "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)",
    "reactor.core.publisher.FluxJust.subscribe(FluxJust.java:70)",
    "reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:53)",
    "reactor.core.publisher.BlockingIterable.iterator(BlockingIterable.java:80)",
    "org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler.result(SpringBootRequestHandler.java:59)",
    "org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler.handleRequest(SpringBootRequestHandler.java:52)",
    "org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:140)",
    "org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:43)"
  ]
}
4

1 回答 1

3

Ganesh,我相信你已经在 SCF 的 Github 上提出了这个问题。正如我在那里所说,我们最近做了一些增强,通过添加入门指南来完善示例和修改文档。

也就是说,使用新的通用请求处理程序,您不再需要提供 AWS 请求处理程序的实施,包括SpringBootApiGatewayRequestHandler.

只需编写启动应用程序以包含函数 bean

@SpringBootApplication
public class FunctionConfiguration {

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

    @Bean
    public Function<String, String> uppercase() {
        return value -> value.toUpperCase();
    }
}

. . . 并在 AWS 仪表板中指定org.springframework.cloud.function.adapter.aws.FunctionInvoker为处理程序。我们将为您完成其余的工作。

于 2019-12-17T05:12:13.620 回答