Функция Micronaut (Groovy) со стандартным вводом / выводом не может разрешить имя функции - PullRequest
0 голосов
/ 27 мая 2020

Я просто пробую Micronaut v1.3.5, возможности функций, на java 11.05 и Groovy V3.0.4.

Я создал шаблонный пример проекта функции, используя cli с mn create-function hello-world --lang groovy

Если я сгенерирую shadowJar с помощью 'gradle shadowJar', он создаст банку и в build / libs.

Если я попытаюсь вызвать это через командную строку, я получу эту ошибку

echo '{"name": "william"}' | java -jar build/libs/hello-world-0.1-all.jar -x
Error executing function (Use -x for more information): No function found for name: hello-world

Error Detail
------------
java.lang.IllegalStateException: No function found for name: hello-world
        at io.micronaut.function.executor.AbstractExecutor.lambda$resolveFunction$0(AbstractExecutor.java:60)
        at java.base/java.util.Optional.orElseThrow(Optional.java:408)
        at io.micronaut.function.executor.AbstractExecutor.resolveFunction(AbstractExecutor.java:60)
        at io.micronaut.function.executor.StreamFunctionExecutor.execute(StreamFunctionExecutor.java:89)
        at io.micronaut.function.executor.StreamFunctionExecutor.execute(StreamFunctionExecutor.java:64)
        at io.micronaut.function.executor.FunctionApplication.lambda$run$0(FunctionApplication.java:62)
        at io.micronaut.function.executor.FunctionApplication.parseData(FunctionApplication.java:98)
        at io.micronaut.function.executor.FunctionApplication.run(FunctionApplication.java:60)
        at io.micronaut.function.executor.FunctionApplication.main(FunctionApplication.java:50)

Сгенерированный тест с использованием Spock работает, и если я добавлю http-server-netty и micronaut-function-web к зависимостям реализации, то я могу запустить приложение изнутри intellij и использовать Postman для запуска функции и получения ответ с использованием localhost:8080/hello-world, который, кажется, работает нормально.

Итак, чего здесь не хватает - почему, когда вы пытаетесь выполнить вызов из командной строки, я получаю эту ошибку?

Сгенерированный application.yml сгенерирован как

micronaut:
  function:
    name: hello-world

, а build.gradle имеет

mainClassName = "io.micronaut.function.executor.FunctionApplication"

что-то базовое c в сантехнике отсутствует и я не могу найти в документации, чтобы помочь решить. Удалось ли кому-нибудь заставить работать simple потоками std in / out, и если да, то что нужно добавить.

Некоторые дополнительные примечания к копанию:

Я пробовал отслеживать с помощью отладчика. На один кадр назад после ошибки я получаю экземпляр AnnotatedFunctionRouteBuilder, который в отладчике показывает «привет-мир» в availableFunctions concurrentHashMap. Все идет нормально.

в методе find (String name) этот класс делегирует поиск переменной localFunctionRegistry, назначенной следующим образом: this.localFunctionRegistry = new DefaultLocalFunctionRegistry(codecRegistry); в строке 84 в конструкторе, как это

public AnnotatedFunctionRouteBuilder(
    ExecutionHandleLocator executionHandleLocator,
    UriNamingStrategy uriNamingStrategy,
    ConversionService<?> conversionService,
    MediaTypeCodecRegistry codecRegistry,
    @Value("${micronaut.function.context-path:/}") String contextPath) {
    super(executionHandleLocator, uriNamingStrategy, conversionService);
    this.localFunctionRegistry = new DefaultLocalFunctionRegistry(codecRegistry);
    this.contextPath = contextPath.endsWith("/") ? contextPath : contextPath + '/';
}

Однако, когда вы теперь перейдете через и изучите этот экземпляр DefaultLocalFunctionRegistry, функции локальных переменных, поставщиков, потребителей и biFunctions, которые все являются пустыми экземплярами LinkedHashmap.

как следствие фактическая делегированная функция поиска в строке 92

   public Optional<? extends ExecutableMethod<?, ?>> find(String name) {
        return Stream.of(functions, suppliers, consumers, biFunctions)
            .flatMap(map -> {
                ExecutableMethod<?, ?> method = map.get(name);
                if (method == null) {
                    return Stream.empty();
                }
                return Stream.of(method);
            })
            .findFirst();
    }

возвращает Optional.Empty, и поэтому find в конечном итоге терпит неудачу, поэтому трассировка ошибки показывает, что сообщение не может найти функцию.

Я застрял на этом этапе, поскольку я этого не понять, как методы, известные экземпляру AnnotatatedFunctionRouteBuilder, не передаются в экземпляр DefaultLocalFunctionRegistry, которому делегирован поиск.

...