【问题标题】:Error while running Spring Cloud Functions sample for Azure functions为 Azure 函数运行 Spring Cloud Functions 示例时出错
【发布时间】:2019-01-04 10:38:38
【问题描述】:

我正在 Azure Functions 之上试验 Spring Cloud Functions,当我尝试为 azure 函数运行示例项目时,我遇到了以下错误。

 Executed 'Functions.uppercase' (Failed, Id=4fd6ef4c-209c-45cb-bf65-ce38e90b6620)
 System.Private.CoreLib: Exception while executing function: Functions.uppercase. System.Private.CoreLib: Result: Failure
 Exception: ClassCastException: com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource cannot be cast to java.lang.String
 Stack: java.lang.ClassCastException: com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource cannot be cast to java.lang.String
   at com.microsoft.azure.functions.worker.binding.DataOperations.apply(DataOperations.java:91)
   at com.microsoft.azure.functions.worker.binding.DataSource.computeByType(DataSource.java:56)
   at com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource.computeByType(RpcHttpRequestDataSource.java:20)
   at com.microsoft.azure.functions.worker.binding.DataSource.computeByName(DataSource.java:42)
   at com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource.computeByName(RpcHttpRequestDataSource.java:20)
   at com.microsoft.azure.functions.worker.binding.BindingDataStore.getDataByName(BindingDataStore.java:50)
   at com.microsoft.azure.functions.worker.broker.ParameterResolver.resolve(ParameterResolver.java:59)
   at com.microsoft.azure.functions.worker.broker.ParameterResolver.resolve(ParameterResolver.java:42)
   at com.microsoft.azure.functions.worker.broker.JavaMethodExecutor.execute(JavaMethodExecutor.java:52)
   at com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.invokeMethod(JavaFunctionBroker.java:51)
   at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:33)
   at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:10)
   at com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45)
   at com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:92)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
   at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
   at java.lang.Thread.run(Thread.java:748)
 .

github上的示例项目链接 https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples/function-sample-azure

public class FooHandler extends AzureSpringBootRequestHandler<Foo, Bar> {
    @FunctionName("uppercase")
    public Bar execute(
            @HttpTrigger(name = "req", methods = { HttpMethod.GET,
                    HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) Foo foo,
            ExecutionContext context) {
        return handleRequest(foo, context);
    }  
}

Azure 本地运行时版本 2(在 Azure 中也失败)

Azure Functions Core Tools (2.3.199 Commit hash: fdf734b09806be822e7d946fe17928b419d8a289)
Function Runtime Version: 2.0.12246.0

由于堆栈跟踪中没有任何与 Spring Cloud 相关的内容,我想这与 Azure 有关。将不胜感激。

【问题讨论】:

  • 错误很清楚地表明com.microsoft.azure.functions.worker.binding.RpcHttpRequestDataSource cannot be cast to java.lang.String

标签: azure-functions azure-functions-runtime azure-functions-core-tools


【解决方案1】:

在 GitHub 上查看此问题:byte[] input broken

感谢您的报告。这是一种回归。作为一种解决方法,请使用java.lang.Byte[] 而不是byte[]

看起来已经修复了:

pragnagopa 于 2018 年 11 月 14 日在#241 关闭此内容

【讨论】:

【解决方案2】:

https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples/function-sample-azure 给出的示例代码存在一些问题。

第一个参数的类型应该是HttpRequestMessage&lt;Optional&lt;Foo&gt;&gt;而不是Foo

@FunctionName("uppercase")
    public Bar execute(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET,
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<Foo>> fooHttp,
        ExecutionContext context) {
        Foo foo = fooHttp.getBody().get();
        return handleRequest(foo, context);
    }

还必须将spring-cloud-function-dependencies 的版本更改为2.0.1.RELEASE

mvn clean package azure-functions:run 然后为我正确运行代码。

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2018-08-19
    • 2017-04-25
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多