Spring Cloud功能:如何将供应商映射到Azure功能

时间:2019-02-20 14:39:25

标签: java azure-functions spring-cloud spring-cloud-function

我正在尝试使用Spring Cloud Function 2.0将Supplier Bean映射到Azure函数,但是我需要扩展AzureSpringBootRequestHandler,它似乎仅支持带有输入参数和返回值的函数。类AzureSpringBootRequestHandler有两个类型参数:输入和输出,AzureSpringBootRequestHandler.handleRequest()也需要输入参数。

@Bean
public Supplier<List<String>> foo() {
    return () -> Arrays.asList("foo1", "foo2");
}

/////

class FooFunction extends AzureSpringBootRequestHandler<Void, List<String>> {
    @FunctionName("foo")
    List<String> foo(@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST},
        authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
                               ExecutionContext context) {
        return handleRequest(null, context);
    }
}

上面的代码在反应堆.core.publisher.FluxJust。(FluxJust.java:60)处导致NPE

将@Bean返回类型更改为Function<Void, List<String>>会导致在AzureSpringFunctionInitializer.lookup上引发IllegalStateException“没有用name = foo定义的函数”

添加虚拟int参数有效。

P.S理想情况下,我什至不需要返回值,所以我可以将其设置为Runnable而不是Supplier,但这似乎完全不受支持。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

Spring Cloud Function 3.0.0中添加了对供应商和消费者的支持。目前,这仍然是一个里程碑。

更多信息this change

我使用Spring Cloud Function 2.x通过将AzureSpringBootRequestHandler的签名更改为使用Optional来解决了这个问题,如下所示:

public class SomeFunction extends AzureSpringBootRequestHandler<Optional<?>, List<Foo>> {

    @FunctionName("some-function")
    public List<Device> execute(@HttpTrigger(name = "req",
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Void> request,
            ExecutionContext context) {
        return handleRequest(Optional.empty(), context);
    }
}

您还必须更改bean的类型以使其与此匹配:

@Bean(name="some-function")
public Function<Optional<?>, List<Device>> someFunction() {
    return v -> fooService.bar();
}