Функция Spring Cloud: как сопоставить поставщика с функцией Azure

Я пытаюсь отобразить bean-компонент поставщика в функцию Azure с помощью Spring Cloud Function 2.0, но мне нужно расширить 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);
    }
}

Вышеприведенный код вызывает NPE в реакторе.core.publisher.FluxJust.(FluxJust.java:60)

Изменение типа возвращаемого значения @Bean на Function<Void, List<String>> вызывает IllegalStateException "Не определена функция с именем =foo" в AzureSpringFunctionInitializer.lookup

Добавление фиктивного параметра int работает.

PS В идеале мне даже не нужно возвращаемое значение, поэтому вместо "поставщика" я бы сделал его работоспособным, но это, похоже, совершенно не поддерживается.

Любая помощь будет оценена.

0 ответов

Поддержка поставщиков и потребителей добавлена ​​в Spring Cloud Function 3.0.0. В настоящее время это все еще важная веха.

Подробнее об этом изменении.

Я решил проблему, используя 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();
}
Другие вопросы по тегам