Функция 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();
}