当前位置: 首页 > 知识库问答 >
问题:

Picocli命令和micronaut中注入的互操作性

呼延河
2023-03-14

在Micronaut中定义@singleton bean不会将同一个实例@inject到Picocli命令中。

Micronaut提供了与PicoCli的集成。看来,必须做的是,从Picocli命令,可以启动Micronaut的EmbeddedServer(也许问题已经在这里了,Micronaut只是真正从Picocli内部启动的?)。当我通过@singleton将一个类定义为singleton,并在Micronaut的Rest-endpoint和Picocli命令中同时注入它时,它会注意到这是两个不同的实例,状态也不相同。我想要的是传输通过命令行接口提供的一些状态来配置后端/REST服务。现在,我刚刚创建了静态实例来共享这个状态,但我想知道是否可以让依赖注入在Picocli和micronaut之间正常工作。

@Singleton
public class SharedState {
    private int num;

    public void setNum(int num) { this.num = num };
    public int getNum() { return this.num; };
}

@Command(name = "ui", description = "...", mixinStandardHelpOptions = true)
public class UICommand implements Runnable {

    @Inject
    SharedState state;

    public static void main(String[] args) throws Exception {
        PicocliRunner.run(UICommand.class, args);
    }

    public void run() {
        EmbeddedServer server = ApplicationContext.run(EmbeddedServer.class);
        state.setNum(42);
    }
}

@Controller("/rest")
public class RestResource{

    @Inject
    SharedState state;

    @Get
    public String get() {
        return state.getNum();
    }
}

如果我在UICommand的run()-方法中的SharedState实例中设置了一些状态,我希望能够从RESTResource中读取它。因此,我希望在调用restendpoint时返回“42”。

有没有什么方法可以以某种方式设置Micronaut/picocli以便早期启动并共享Micronaut/picocli的依赖注入容器?还是Micronaut真的只是从EmbeddedServer调用开始的?在这种情况下,我有什么选择仍然有一些互操作性?我能以某种方式明确地向Micronaut的DI容器询问实例吗?

共有1个答案

巫马嘉祯
2023-03-14

我认为问题是问题中的代码创建了两个单独的applicationcontext实例。

对引擎盖下的picoclirunner.run(uicommand.class,args)的调用创建了ApplicationContext,而uicommand.run方法调用了ApplicationContext.run(EmbeddedServer.class),后者启动了另一个ApplicationContext实例。

解决此问题的一种方法可能是注入applicationcontext而不是启动一个新的:

@Command(name = "ui", description = "...", mixinStandardHelpOptions = true)
public class UICommand implements Runnable {

    @Inject
    SharedState state;

    @Inject
    ApplicationContext appContext;

    public static void main(String[] args) throws Exception {
        PicocliRunner.run(UICommand.class, args);
    }

    public void run() {
        // start the injected, shared, application context (not a new instance)
        if (!appContext.isRunning()) { // future versions of PicocliRunner may start the context
            appContext.start();
        }

        // start the embedded server
        EmbeddedServer server = appContext.getBean(EmbeddedServer.class);
        if (!server.isRunning()) {
            server.start();
        }
        state.setNum(42);
    }
}
 类似资料:
  • 6.3. 命令注入 使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。 Exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。使用方式如下: <?php $last = exec('ls', $output, $ret

  • 启动多个whistle 如果你想在同一台机器启动多个whistle,方便多个浏览器或者供多人使用,有两种方式: 切换到不同的系统用户,在每个系统用户启动一个whistle代理服务(每个服务的端口号可以用命令行参数w2 start -p xxxx来指定) 也可以通过切换规则目录和端口号的方式来解决(注意S、C都是大写, newStorageDir为空表示使用当前配置) w2 start -S new

  • 标准 go 语言项目文件目录格式 项目文件夹就是 GOPATH 指向的文件夹 src 文件夹是专门用于存放源码文件的 main 文件夹是专门用于存储 package main 包相关源码文件的 其它文件夹是专门用于存储除 package main 包以外源码文件的 bin 文件夹是专门用于存储编译之后的可执行程序的 pag 文件夹是专门用于存储编译之后的 .a 文件的 |---项目文件夹 ----

  • 主要内容:常用命令Redis string 类型提供了一些专门操作 数值的命令,比如 INCRBY(自增)、DECRBR(自减)、INCR(加1) 和 DECR(减1) 等命令。数值操作,同样有特定的应用场景,比如常见的点赞、取消点赞、关注、取消关注等,这类和计数相关的场景都可以使用数值操作来实现。 注意:此时  key 对应的 value 值是必须是一个整数,或浮点数,使用命令对这个数值进行自增或自减操作。当然,

  • 本文向大家介绍Redis操作命令总结,包括了Redis操作命令总结的使用技巧和注意事项,需要的朋友参考一下 一、key pattern 查询相应的key   (1)redis允许模糊查询key  有3个通配符  *、?、[]   (2)randomkey:返回随机key     (3)type key:返回key存储的类型   (4)exists key:判断某个key是否存在   (5)del

  • 问题内容: 我正在尝试使用带有适当命令的命令自动创建开发Docker映像。我需要在命令中运行的脚本之一希望用户单击以阅读其许可协议。因此,有两个问题: ?中所有命令的输出在哪里? 可以与上述命令进行交互的解决方案是什么?现在,命令陷入僵局,要求用户无限循环输入。 问题答案: 在构建过程中,命令的输出显示在您的终端中。Docker构建过程是完全非交互的,因此您必须找到某种方式来自动接受这些条款(几乎