Spring 云函数无法从消息中读取函数定义 header
Spring Cloud function cannot read function definition from Message header
我已经创建了一个基于 AWS Lambda 的 Spring 云函数,它具有多种功能,当我在 AWS Lambda 配置面板中定义一个“spring_cloud_function_definition”环境变量时,它工作正常。这些函数的输入和输出是 Message>,因此负载和 http headers 也可以被访问 运行time。
我想在不同的 API 网关方法中使用这个 AWS Lambda 函数,例如:
- /item [POST] -> 应该调用 saveItem
- /item [DELETE] -> deleteItem 应该被调用
- ...等等...
我在 Spring.io 上找到了这个文档,它说它是可行的:
If the input argument is of type Message<?>, you can communicate routing instruction by setting one of spring.cloud.function.definition or spring.cloud.function.routing-expression Message headers. For more static cases you can use spring.cloud.function.definition header which allows you to provide the name of a single function (e.g., …definition=foo) or a composition instruction (e.g., …definition=foo|bar|baz)
因此以下测试事件应该 运行 在 AWS Lambda 中没有任何失败:
{
“方法”:“POST”,
“body”:“{“键”:“值”}”,
“headers”:{
"spring.cloud.function.definition": "saveItem"
}
}
但当然会抛出异常:
No function defined: java.lang.IllegalStateException
java.lang.IllegalStateException: No function defined
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.apply(AbstractSpringFunctionAdapterInitializer.java:187)
at org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler.handleRequest(SpringBootRequestHandler.java:51)
at org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:140)
at org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:43)
我尝试了很多配置(application.properties、AWS Lambda env 属性、header 等)但没有任何反应:
- spring.cloud.function.routing-expression=headers.function_name
- 设置spring.cloud.function.definition=saveItem
可能是什么问题?在这种情况下最好的配置是什么?如有任何帮助,我们将不胜感激!
使用的技术:
- 云:AWS
- 云组件:Lambda + API网关
- AWS Lambda 处理程序class:org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler
- AWS Lambda 输入和输出事件:APIGatewayProxyRequestEvent,APIGatewayProxyResponseEvent
- Java: 8
- Spring云函数版本:3.0.6.RELEASE
我已经更新到 v3.1.3 并切换到 FunctionInvoker,并且我已经将函数定义添加到请求模板映射 header,并且工作正常。
无论如何,感谢您的帮助。 :)
我已经创建了一个基于 AWS Lambda 的 Spring 云函数,它具有多种功能,当我在 AWS Lambda 配置面板中定义一个“spring_cloud_function_definition”环境变量时,它工作正常。这些函数的输入和输出是 Message>,因此负载和 http headers 也可以被访问 运行time。
我想在不同的 API 网关方法中使用这个 AWS Lambda 函数,例如:
- /item [POST] -> 应该调用 saveItem
- /item [DELETE] -> deleteItem 应该被调用
- ...等等...
我在 Spring.io 上找到了这个文档,它说它是可行的:
If the input argument is of type Message<?>, you can communicate routing instruction by setting one of spring.cloud.function.definition or spring.cloud.function.routing-expression Message headers. For more static cases you can use spring.cloud.function.definition header which allows you to provide the name of a single function (e.g., …definition=foo) or a composition instruction (e.g., …definition=foo|bar|baz)
因此以下测试事件应该 运行 在 AWS Lambda 中没有任何失败:
{ “方法”:“POST”, “body”:“{“键”:“值”}”, “headers”:{ "spring.cloud.function.definition": "saveItem" } }
但当然会抛出异常:
No function defined: java.lang.IllegalStateException
java.lang.IllegalStateException: No function defined
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.apply(AbstractSpringFunctionAdapterInitializer.java:187)
at org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler.handleRequest(SpringBootRequestHandler.java:51)
at org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:140)
at org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler.handleRequest(SpringBootApiGatewayRequestHandler.java:43)
我尝试了很多配置(application.properties、AWS Lambda env 属性、header 等)但没有任何反应:
- spring.cloud.function.routing-expression=headers.function_name
- 设置spring.cloud.function.definition=saveItem
可能是什么问题?在这种情况下最好的配置是什么?如有任何帮助,我们将不胜感激!
使用的技术:
- 云:AWS
- 云组件:Lambda + API网关
- AWS Lambda 处理程序class:org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler
- AWS Lambda 输入和输出事件:APIGatewayProxyRequestEvent,APIGatewayProxyResponseEvent
- Java: 8
- Spring云函数版本:3.0.6.RELEASE
我已经更新到 v3.1.3 并切换到 FunctionInvoker,并且我已经将函数定义添加到请求模板映射 header,并且工作正常。
无论如何,感谢您的帮助。 :)