Я просто пробую 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, которому делегирован поиск.