@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
中的值吗?
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
参数正确显示候选人,那就太好了。
我有一个带有枚举 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
中的值吗?
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
参数正确显示候选人,那就太好了。