diff --git a/cli/src/main/java/io/kestra/cli/App.java b/cli/src/main/java/io/kestra/cli/App.java index f16e01a4d22..4e309c61810 100644 --- a/cli/src/main/java/io/kestra/cli/App.java +++ b/cli/src/main/java/io/kestra/cli/App.java @@ -88,11 +88,12 @@ protected static ApplicationContext applicationContext(Class mainClass, .environments(Environment.CLI); CommandLine cmd = new CommandLine(mainClass, CommandLine.defaultFactory()); + continueOnParsingErrors(cmd); CommandLine.ParseResult parseResult = cmd.parseArgs(args); List parsedCommands = parseResult.asCommandLineList(); - CommandLine commandLine = parsedCommands.get(parsedCommands.size() - 1); + CommandLine commandLine = parsedCommands.getLast(); Class cls = commandLine.getCommandSpec().userObject().getClass(); if (AbstractCommand.class.isAssignableFrom(cls)) { @@ -114,15 +115,17 @@ protected static ApplicationContext applicationContext(Class mainClass, .stream() .filter(argSpec -> ((Field) argSpec.userObject()).getName().equals("serverPort")) .findFirst() - .ifPresent(argSpec -> { - properties.put("micronaut.server.port", argSpec.getValue()); - }); + .ifPresent(argSpec -> properties.put("micronaut.server.port", argSpec.getValue())); builder.properties(properties); } return builder.build(); } + private static void continueOnParsingErrors(CommandLine cmd) { + cmd.getCommandSpec().parser().collectErrors(true); + } + @SuppressWarnings("unchecked") private static T getPropertiesFromMethod(Class cls, String methodName, Object instance) { try { diff --git a/cli/src/test/java/io/kestra/cli/AppTest.java b/cli/src/test/java/io/kestra/cli/AppTest.java index 9f14d4aaef7..d0075be2320 100644 --- a/cli/src/test/java/io/kestra/cli/AppTest.java +++ b/cli/src/test/java/io/kestra/cli/AppTest.java @@ -45,4 +45,20 @@ void testServerCommandHelp(String serverType) { assertThat(out.toString(), startsWith("Usage: kestra server " + serverType)); } } + + @Test + void missingRequiredParamsPrintHelpInsteadOfException() { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setErr(new PrintStream(out)); + + final String[] argsWithMissingParams = new String[]{"flow", "namespace", "update"}; + + try (ApplicationContext ctx = App.applicationContext(App.class, argsWithMissingParams)) { + new CommandLine(App.class, new MicronautFactory(ctx)).execute(argsWithMissingParams); + + assertThat(out.toString(), startsWith("Missing required parameters: ")); + assertThat(out.toString(), containsString("Usage: kestra flow namespace update ")); + assertThat(out.toString(), not(containsString("MissingParameterException: "))); + } + } }