guice - 使用 Guice 和 lombok 时使用 picocli 生成文档
问题描述
我使用 picocli(4.5.2)、lombok 和 guice 创建了一个 cli。我所有的命令类都有私有的最终字段(服务),它们是用 lombok 和 guice 初始化的。例如:
@Command(name = "example", helpCommand = true,
description = "example controller")
@RequiredArgsConstructor(onConstructor = @__({@Inject}))
public class ExampleCommand implements Callable<Integer> {
private final MyFacade myFacade;
@Setter
@ParentCommand
private ParentCommandHere parentCommandHere;
@Override
public Integer call() {
// do something
return 0;
}
}
我也有 picocli 文档中建议的 GuiceFactory 。
当我尝试使用 ManPageGenerator 生成文档时(使用以下文档)
我看到这个错误:
picocli.CommandLine$InitializationException: Cannot instantiate path.to.my.command.ExampleCommand : the class has no constructor
at picocli.CommandLine$DefaultFactory.create(CommandLine.java:5199)
at picocli.CommandLine$Model$CommandUserObject.getInstance(CommandLine.java:11160)
at picocli.CommandLine$Model$CommandSpec.userObject(CommandLine.java:5928)
at picocli.codegen.docgen.manpage.ManPageGenerator.traceAllSpecs(ManPageGenerator.java:312)
at picocli.codegen.docgen.manpage.ManPageGenerator.generateManPage(ManPageGenerator.java:285)
at picocli.codegen.docgen.manpage.ManPageGenerator.generateManPage(ManPageGenerator.java:300)
at picocli.codegen.docgen.manpage.ManPageGenerator.generateManPage(ManPageGenerator.java:300)
at picocli.codegen.docgen.manpage.ManPageGenerator$App.call(ManPageGenerator.java:215)
at picocli.codegen.docgen.manpage.ManPageGenerator$App.call(ManPageGenerator.java:166)
at picocli.CommandLine.executeUserObject(CommandLine.java:1933)
at picocli.CommandLine.access$1200(CommandLine.java:145)
at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)
at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2159)
at picocli.CommandLine.execute(CommandLine.java:2058)
at picocli.codegen.docgen.manpage.ManPageGenerator.main(ManPageGenerator.java:239)
Caused by: java.lang.NoSuchMethodException: path.to.my.command.ExampleCommand.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at picocli.CommandLine$DefaultFactory.create(CommandLine.java:5174)
at picocli.CommandLine$DefaultFactory.create(CommandLine.java:5197)
有没有办法解决这个问题?
解决方案
要让 Guice 依赖注入与 picocli 一起工作,您的应用程序可能有一个自定义工厂。这个工厂在运行应用程序时是必需的,但在使用生成文档时也是必需的。ManPageGenerator
ManPageGenerator
应用程序有一个-c
or--factory=<factoryClass>
选项,您可以在其中指定此自定义工厂的类名。在构建脚本中调用 javaExec 任务时将此添加到参数中。
推荐阅读
- python - 无法使用 Python 3.8.0 在命令行上运行 python 文件;它改为调用 python 解释器
- angular - 将 nebular 与 font-awesome 集成时的问题
- java - 有这个 java.lang.ArrayIndexOutOfBoundsException 错误阻止我继续我的循环迭代
- apache - 反向代理将不同的名称定向到不同的端口
- elisp - 两者 (funcall (lambda 和 (lambda 工作
- c++ - 蒂姆排序给出了不是 2 次幂的元素数量的错误
- ruby-on-rails - 未定义方法的 redmine 插件 500 错误
- google-apps-script - 如何在对象未定义时返回属性
- python-3.x - 如何在 fastai 中显示使用 open_image 函数打开的图像?
- cordova - ajax 调用不适用于 phonegap 构建(cli 9)和 android SdkVersion 28