如何配置picocli让空选项解析为null并添加至List<String>
解决Picocli重复选项收集null值的问题
问题分析
你配置了--msg-content-list-item选项,设置arity="0..1"和defaultValue=CommandLine.Option.NULL_VALUE,期望输入--msg-content-list-item --msg-content-list-item pepa时得到[null, "pepa"],但实际仅收集到[pepa]。这是因为Picocli默认情况下,对于arity="0..1"的重复选项,仅会收集带有参数的调用,不带参数的调用不会被添加到列表中。
解决方案
修改@CommandLine.Option注解,添加collectAll = true配置,强制收集每个选项的调用实例,包括不带参数的情况:
@CommandLine.Option( names = "--msg-content-list-item", arity = "0..1", defaultValue = CommandLine.Option.NULL_VALUE, collectAll = true ) private List<String> msgContentItems;
原理说明
collectAll = true:告诉Picocli,不管选项是否带有参数,只要该选项出现一次,就向列表中添加一个元素。- 当选项不带参数时,会使用
defaultValue指定的NULL_VALUE(即null)作为该位置的列表元素;当带有参数时,则使用传入的参数值。
配置完成后,输入--msg-content-list-item --msg-content-list-item pepa,解析得到的List<String>就会是[null, "pepa"],符合预期。
内容的提问来源于stack exchange,提问作者user7610
相关产品推荐
相关产品推荐

