From df19da0dde96ed63d338da1a3aefa7c36f8645d9 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 22 Nov 2022 07:47:52 +0000 Subject: [PATCH] Method execution should not error without value - Do npe check when getting class type out from incoming value. - Backport #572 - Fix #573 --- .../shell/command/CommandExecution.java | 4 +++- .../shell/command/CommandExecutionTests.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/spring-shell-core/src/main/java/org/springframework/shell/command/CommandExecution.java b/spring-shell-core/src/main/java/org/springframework/shell/command/CommandExecution.java index 3c742e87..b1b74c5b 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/command/CommandExecution.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/command/CommandExecution.java @@ -183,8 +183,10 @@ public interface CommandExecution { if (parameterName == null) { return false; } + Class sourceType = paramValues.get(parameterName) != null ? paramValues.get(parameterName).getClass() + : null; return paramValues.containsKey(parameterName) && conversionService - .canConvert(paramValues.get(parameterName).getClass(), parameter.getParameterType()); + .canConvert(sourceType, parameter.getParameterType()); } @Override diff --git a/spring-shell-core/src/test/java/org/springframework/shell/command/CommandExecutionTests.java b/spring-shell-core/src/test/java/org/springframework/shell/command/CommandExecutionTests.java index 1ef21d22..d801bac0 100644 --- a/spring-shell-core/src/test/java/org/springframework/shell/command/CommandExecutionTests.java +++ b/spring-shell-core/src/test/java/org/springframework/shell/command/CommandExecutionTests.java @@ -100,6 +100,26 @@ public class CommandExecutionTests extends AbstractCommandTests { assertThat(pojo1.method1Ctx).isNotNull(); } + @Test + public void testMethodArgWithoutValue() { + CommandRegistration r1 = CommandRegistration.builder() + .command("command1") + .description("help") + .withOption() + .longNames("arg1") + .description("some arg1") + .position(0) + .arity(OptionArity.EXACTLY_ONE) + .and() + .withTarget() + .method(pojo1, "method4") + .and() + .build(); + execution.evaluate(r1, new String[]{"--arg1"}); + assertThat(pojo1.method4Count).isEqualTo(1); + assertThat(pojo1.method4Arg1).isNull(); + } + @Test public void testMethodSinglePositionalArgs() { CommandRegistration r1 = CommandRegistration.builder()