如何让picocli在无CLI选项时不覆盖构造函数设置的值?
解决picocli覆盖构造函数中Optional默认值的问题
问题原因
picocli对Optional类型的选项字段有特殊处理:当未通过CLI指定该选项时,默认会将字段重置为Optional.empty,哪怕你已经在构造函数中初始化了自定义默认值。这是框架针对Optional类型的预设行为,和defaultValue的默认值"__no_default_value__"规则不冲突——后者针对的是非Optional类型的字段。
解决方案
要保留构造函数中设置的默认值,只需在@Option注解中添加resetValues = false属性,告诉picocli不要重置未指定选项的现有值:
修改后的示例代码
import picocli.CommandLine; import static picocli.CommandLine.*; import java.util.*; import java.io.*; public class MWE { static class Tar { @Option(names = { "-f", "--file" }, paramLabel = "ARCHIVE", description = "the archive file", resetValues = false) Optional<File> archive; public Tar() { archive = Optional.of(new File("helloworld")); } } public static void main(String[] args) throws Exception{ Tar tar = new Tar(); System.out.println(tar.archive); new CommandLine(tar).parseArgs(args); System.out.println(tar.archive); } }
其他可选方案
如果不需要在构造函数中初始化,也可以直接通过@Option的defaultValue属性指定默认值,picocli会自动将其转换为Optional<File>类型:
@Option(names = { "-f", "--file" }, paramLabel = "ARCHIVE", description = "the archive file", defaultValue = "helloworld") Optional<File> archive;
这种方式下无需手动在构造函数中初始化字段,picocli会处理默认值的注入。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

