@Option with enum List 不接受 ${COMPLETION-CANDIDATES} 显示的候选人

@Option with enum List does not accept candidates that ${COMPLETION-CANDIDATES} shows

我有一个带有枚举 java.util.List@Option,而 picocli 只是不接受 ${COMPLETION-CANDIDATES} 显示的候选人。

picocli 显示和接受值的方式彼此不一致。

代码:

@CommandLine.Option(
    names = {"-c", "--columns-to-hide"},
    description = "Comma separated list of column names that won't be displayed"
            + "%nCandidates: ${COMPLETION-CANDIDATES}",
    split = ",")
final List<Header> columnsToHide = new ArrayList<>();

呈现的帮助:

-c, --columns-to-hide   Comma separated list of column names that won't be displayed
                        Candidates: PORTFOLIO, TICKER, TYPE, CREATED, VOLUME, PRICE, FEE, TRANSFER_ID

当我尝试使用帮助中显示的乘法候选时出现以下错误:

命令:

java -jar my.jar ... -i "PORTFOLIO, TICKER, TYPE"

错误:

Invalid value for option '--columns-to-hide' (<columnsToHide>): expected one of [PORTFOLIO, TICKER, TYPE, CREATED, VOLUME, PRICE, FEE, TRANSFER_ID] (case-sensitive) but was ' TICKER'

问题是呈现的帮助显示 comma + space 分隔列表,但 picocli 解析器只接受没有 space.

的逗号分隔列表

已接受:

-i "PORTFOLIO,TICKER,TYPE"

这个显示错误:

-i "PORTFOLIO, TICKER, TYPE"

我的要求是接受带有 AND 而没有 space 的候选列表,这个错误让我的用户感到困惑。

作为一种变通方法,我可以使用 String 作为类型而不是 List 和 split + trim 所提供的 String 但这使我的代码不如没有这个错误时那样优雅。另外我需要检查提供的列表是否只包含有效的枚举值。

你遇到过这个错误吗?

我可以指示 picocli 在呈现选项时以某种方式使用 split 中的值吗?

解决方案:Custom Type Converters

public class HeaderConverter implements CommandLine.ITypeConverter<List<Header>> {

    @Override
    public List<Header> convert(String s) throws Exception {
        List<Header> headers = new ArrayList<>();
        var params = s.split(",");
        Arrays.stream(params).forEach(x -> headers.add(Header.valueOf(x.trim())));
        return headers;
    }
}

这很好用,但如果 picocli 可以根据 split 参数正确显示候选人,那就太好了。