Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unexpected behavior with @Command annotation #1158

Open
everyonehatesvludd opened this issue Feb 4, 2025 · 1 comment
Open

Unexpected behavior with @Command annotation #1158

everyonehatesvludd opened this issue Feb 4, 2025 · 1 comment
Labels
status/need-triage Team needs to triage and take a first look

Comments

@everyonehatesvludd
Copy link

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'
@github-actions github-actions bot added the status/need-triage Team needs to triage and take a first look label Feb 4, 2025
@sourabhsmf
Copy link

Ran into same issue, looks like it requires @Command annotation to be present on the class as well otherwise it does not register the command. It is not very clear when reading the documentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status/need-triage Team needs to triage and take a first look
Projects
None yet
Development

No branches or pull requests

2 participants