【问题标题】:spring boot remote shell custom commandspring boot 远程shell自定义命令
【发布时间】:2014-11-29 20:11:24
【问题描述】:

我尝试向 Spring Boot 远程 shell 添加一个新的自定义命令,但没有成功。 在文档中只有一个 groovy 示例可用,但我喜欢使用 Java 创建一个新命令。

http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-remote-shell.html 我还查看了 CRaSH 文档:http://www.crashub.org/1.3/reference.html#_java_commands

我将我的类放在包命令和 crash.commands 下,但如果我通过 ssh 连接到 shell 并输入帮助,我看不到我的新命令。知道我做错了什么吗?

这是我的 Java 代码:

package commands;

import org.crsh.cli.Command;
import org.crsh.cli.Usage;
import org.crsh.command.BaseCommand;
import org.springframework.stereotype.Component;

@Component
public class hello extends BaseCommand {

  @Command
  @Usage("Say Hello")
  public String test() {
    return "HELLO";
  }
} 

【问题讨论】:

  • Spring Boot shell 扩展将命令视为 Groovy 脚本,而不是 Spring bean。无论如何,您的 Java 代码通常都可以用作 Groovy;只需包含源代码而不是编译的 .class 文件。

标签: java spring shell


【解决方案1】:

如果你的班级叫'hello',把它放进去

resources/crash/commands/hello/hello.java

有一个包声明并不重要。 您不必在 src 中添加任何内容,只需将其放在资源中即可。

@Component 不是必需的。

这个类是在运行时编译的。见:

org.crsh.lang.impl.java.JavaCompiler#compileCommand

因此,任何依赖注入要求都需要通过延迟初始化来相应地考虑。

【讨论】:

    【解决方案2】:

    将类放在默认包中(即省略 package 语句)并将类的 Java 源代码放在 src/main/resources/commands 中。 Spring/Crash 将在您第一次调用该命令时编译 Java 代码。此外,如果该类实现单个命令,则方法名称应为“main”,否则用户必须键入:

    > hello test
    

    您也不需要类上的@Component 注释,因为它不是 Spring 托管 bean。

    【讨论】:

    • 如果命令类位于默认包中,它将被 Spring 的componentScan 省略。那么我该如何使用服务、Spring Data 和我的 bean 之类的东西呢?
    • 提供了一个 Spring 的 BeanFactory 实例,您可以在命令脚本中访问它以获取服务等实例。比如:BeanFactory factory = context.attributes['spring.beanfactory'] MyService service = factory.getBean(MyService.class)
    • 感谢您的回答!你能告诉我在这种情况下如何获取上下文吗?
    • 我不确定我是否理解您的问题;上面的上下文变量会自动注入到 Groovy 命令脚本中。使用上下文,您可以获得 Spring BeanFactory 并将其传递给 Java 类或将所需的 bean 传递给 Java 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多