Skip to content

Unexpected behavior with @Command annotation #1158

Open
@vregi

Description

@vregi

Spring Boot 3.4.2
Spring Shell 3.4.0
JDK 17

Problem:

When using the @Command annotation on a component class, the Spring Shell fails to register the command, throwing an IllegalStateException with the message "No Command annotation found" in case of @EnableCommand usage and application runs without any errors, but commands are completely unregistered in case of @CommandScan usage.

Code:

CommandsNotation.java

import com.slezkipotekli.githubactivity.services.ActivityService;
import lombok.AllArgsConstructor;
import org.springframework.shell.command.annotation.Command;
import org.springframework.shell.command.annotation.Option;
import org.springframework.stereotype.Component;

@Component
@AllArgsConstructor
public class CommandsNotation {
    ActivityService activityService;

    @Command(command = "github-activity")
    public String githubActivity(@Option(longNames = "username", required = false) String username ){
        return activityService.get_activity(username);
    }
}

GithubActivityApplication.java

package com.slezkipotekli.githubactivity;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.command.annotation.CommandScan;
import org.springframework.shell.command.annotation.EnableCommand;

@SpringBootApplication
// @EnableCommand(CommandsNotation.class) - Included every option I used for clarity
// @CommandScan - Included every option I used for clarity
// @CommandScan("com.slezkipotekli.githubactivity") - Included every option I used for clarity
public class GithubActivityApplication {

    public static void main(String[] args) {
        SpringApplication.run(GithubActivityApplication.class, args);
    }

}

Output:

With @EnableCommand(CommandsNotation.class)

2025-02-03T21:53:21.864-05:00 ERROR 11404 --- [github-activity] [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: No Command annotation found on  'com.slezkipotekli.githubactivity.CommandsNotation'.
	at org.springframework.util.Assert.state(Assert.java:101) ~[spring-core-6.2.2.jar:6.2.2]
	at org.springframework.shell.command.annotation.support.CommandRegistrationBeanRegistrar.registerCommandClassBeanDefinition(CommandRegistrationBeanRegistrar.java:91) ~[spring-shell-core-3.4.0.jar:3.4.0]
	at org.springframework.shell.command.annotation.support.CommandRegistrationBeanRegistrar.register(CommandRegistrationBeanRegistrar.java:67) ~[spring-shell-core-3.4.0.jar:3.4.0]
	at org.springframework.shell.command.annotation.support.CommandRegistrationBeanRegistrar.register(CommandRegistrationBeanRegistrar.java:61) ~[spring-shell-core-3.4.0.jar:3.4.0]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]

With @CommandScan

 :: Spring Boot ::                (v3.4.2)

2025-02-03T21:56:03.757-05:00 DEBUG 9340 --- [github-activity] [           main] o.s.s.s.StandardMethodTargetRegistrar    : Found commandBeans to register {help=org.springframework.shell.standard.commands.Help@2d7637e6, clear=org.springframework.shell.standard.commands.Clear@515b9d4a, quit=org.springframework.shell.standard.commands.Quit@39b626e5, stacktrace=org.springframework.shell.standard.commands.Stacktrace@32a4ecbe, script=org.springframework.shell.standard.commands.Script@2e71240b, historyCommand=org.springframework.shell.standard.commands.History@23cd5d42, version=org.springframework.shell.standard.commands.Version@2b44d6d0}

2025-02-03T21:56:03.769-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[help]' key='help'
2025-02-03T21:56:03.788-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with mp='method 'help' parameter 0' so='@org.springframework.shell.standard.ShellOption(optOut=false, arity=2147483647, help="The command to obtain help for.", valueProvider=org.springframework.shell.standard.CommandValueProvider.class, value={"-C", "--command"}, defaultValue="__NULL__")'
2025-02-03T21:56:03.789-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering o='-C' stripped='C'
2025-02-03T21:56:03.790-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering o='--command' stripped='command'
2025-02-03T21:56:03.790-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering longNames='[command]' shortNames='[C]'
2025-02-03T21:56:03.796-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[clear]' key='clear'
2025-02-03T21:56:03.797-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[quit, exit]' key='quit'
2025-02-03T21:56:03.798-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[stacktrace]' key='stacktrace'
2025-02-03T21:56:03.799-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[script]' key='script'
2025-02-03T21:56:03.800-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with mp='method 'script' parameter 0' so='null'
2025-02-03T21:56:03.800-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Using mp='method 'script' parameter 0' longName='file' parameterType='class java.io.File'
2025-02-03T21:56:03.801-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[history]' key='history'
2025-02-03T21:56:03.802-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with mp='method 'history' parameter 0' so='@org.springframework.shell.standard.ShellOption(optOut=false, arity=-1, help="A file to save history to.", valueProvider=org.springframework.shell.standard.ShellOption.NoValueProvider.class, value={}, defaultValue="__NULL__")'
2025-02-03T21:56:03.802-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Using mp='method 'history' parameter 0' longName='file' parameterType='class java.io.File'
2025-02-03T21:56:03.802-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering longNames='[file]' shortNames='[]'
2025-02-03T21:56:03.802-05:00 DEBUG 9340 --- [           main] o.s.s.s.StandardMethodTargetRegistrar    : Registering with keys='[version]' key='version'

shell:>help

AVAILABLE COMMANDS

Built-In Commands
       help: Display help about available commands
       stacktrace: Display the full stacktrace of the last error.
       clear: Clear the shell screen.
       quit, exit: Exit the shell.
       history: Display or save the history of previously run commands
       version: Show version info
       script: Read and execute commands from a file.



shell:>github-activity
No command found for 'github-activity'

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions