【问题标题】:Micronaut dependency inject not working with picocli featureMicronaut 依赖注入不适用于 picocli 功能
【发布时间】:2019-07-20 19:41:46
【问题描述】:

我使用以下命令创建了一个 micronaut 项目

mn create-cli-app micronaut-cli

在项目中,我创建了一个 @Singleton 类并将其注入到我的 Command 类中,但由于对象始终为空,因此注入不起作用。

我的单例类:

@Singleton
public class ConverterService {
    public String service(){return "good service";}
}

我的命令类:

@Command(name = "mini-java-util", description = "...",
    mixinStandardHelpOptions = true)
public class MiniJavaUtilCommand implements Runnable {

    @Inject ConverterService converterService;
    @Option(names = {"-v", "--verbose"}, description = "...")
boolean verbose;

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

    public void run() {
        // business logic here
        if (verbose) {
            System.out.println("converterService :" + converterService);
        }
    }
}

当我运行这个课程时,我得到:

converterService :null

请帮助我为什么依赖注入不起作用。

【问题讨论】:

  • 我对 Micronaut 不是很熟悉,但是 Spring 支持构造函数注入,这有助于防止出现此类问题。我建议先尝试一下。
  • 请在 Micronaut GitHub 问题跟踪器上为此提出票证。还有一些用于 Micronaut 的 Gitter 频道(不确定该使用哪一个),人们通常反应很快。
  • 添加一些版本信息(Micronaut 版本、picocli 版本、Java 版本)可能会有用。
  • @chrylis 这与基于构造函数的注入与基于字段的注入无关。我怀疑问题是注释处理器没有启用,在这种情况下,两种 DI 方法都行不通。
  • @RemkoPopma “请在 Micronaut GitHub 问题跟踪器上为此提出票证。” - 我认为没有任何必要。请参阅下面的答案。

标签: java micronaut


【解决方案1】:

我无法重现您描述的行为。

https://github.com/jeffbrown/cliinjection 上查看该项目。我将您的课程粘贴到该项目中:

https://github.com/jeffbrown/cliinjection/blob/87f289f1bb0e46a487b59665743b5bc767efa620/src/main/java/cliinjection/ConverterService.java

package cliinjection;

import javax.inject.Singleton;

@Singleton
public class ConverterService {
    public String service(){return "good service";}
}

https://github.com/jeffbrown/cliinjection/blob/87f289f1bb0e46a487b59665743b5bc767efa620/src/main/java/cliinjection/MiniJavaUtilCommand.java

package cliinjection;

import io.micronaut.configuration.picocli.PicocliRunner;

import picocli.CommandLine.Command;
import picocli.CommandLine.Option;

import javax.inject.Inject;

@Command(name = "mini-java-util", description = "...",
    mixinStandardHelpOptions = true)
public class MiniJavaUtilCommand implements Runnable {

    @Inject
    ConverterService converterService;
    @Option(names = {"-v", "--verbose"}, description = "...")
    boolean verbose;

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

    public void run() {
        // business logic here
        if (verbose) {
            System.out.println("converterService :" + converterService);
        }
    }
}

这似乎有效:

~ $ git clone git@github.com:jeffbrown/cliinjection.git
Cloning into 'cliinjection'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 21 (delta 0), reused 21 (delta 0), pack-reused 0
Receiving objects: 100% (21/21), 53.36 KiB | 1.16 MiB/s, done.
~ $ 
~ $ cd cliinjection/
cliinjection master $ 
cliinjection master $ ./gradlew assemble

> Task :compileJava
Note: Creating bean classes for 2 type elements

BUILD SUCCESSFUL in 3s
10 actionable tasks: 10 executed
cliinjection master $ 
cliinjection master $ java -jar build/libs/cliinjection-0.1-all.jar  -v
07:35:30.515 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [cli]
converterService :cliinjection.ConverterService@7fd4acee

编辑

我突然想到,引入您报告的行为的一种方法是,如果项目未在启用注释处理器的情况下编译。发生这种情况的最常见方式是,如果您在未启用注释处理器的上下文中直接从 IDE 运行项目。我们在https://docs.micronaut.io/1.0.5/guide/index.html#ideSetup 的用户指南中对此进行了介绍。

【讨论】:

  • 您的回答帮助了我。 DI 不工作,因为我没有在我的编辑器中启用“注释处理”。之后,它的工作正常。我想在 Kotlin 中做同样的事情并创建了一个项目 'mn create-cli-app mc-cli-test --lang kotlin' 然后启用注释处理,但不确定为什么 DI 在 Kotlin 项目中不起作用。我在github.com/kpradeep12/mc-cli-test 上传项目请你克隆它检查为什么 DI 在 Kotlin 中不起作用?
  • 你的提交帮助了我。我使用 'val' 而不是 'var' 谢谢。
猜你喜欢
  • 2023-03-26
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2021-06-08
  • 1970-01-01
  • 2021-04-24
  • 2019-09-11
相关资源
最近更新 更多