jCommander - 为未知和未使用的值抛出异常?
jCommander - throw Exception for unknown and unused value?
我正在使用 JCommander 1.48,我遇到了以下问题:
例如我有这些参数:
@Parameter(names = "user", description = "the User")
private String user;
@Parameter(names = "password", description = "the password")
private String password
我是 运行 我的程序,参数如下:
--user hugo --password secret
和:
--user hugo david --password secret
两者是同一个解决方案,程序运行完美。但是我希望程序在参数值太多时抛出异常。我知道 "arity"(参数值的数量)作为 @Parameter 注释的配置,但字符串的默认值 arity 是 1 allready。似乎在第一个值之后一切都被忽略了,只要它不是另一个参数。
有什么解决方案或想法吗?
编辑:
基本解决方案(由 assylias 发布)对我不起作用。更准确的示例:
public class MyTestProgram {
private final Params options;
public MyTestProgram(String[] args) {
options = new Params();
new JCommander(options).parse("--user hugo david --password secret".split(" "));
//pass "args" to parse() instead of hardcoded string.
}
public static void main(String[] args) throws Exception {
System.setProperty("org.jboss.logging.provider", "slf4j");
new MyTestProgram(args);
}
}
public class Params {
@Parameter
private List<String> parameters = new ArrayList<>();
@Parameter(names = "--user", description = "the user", required = true)
private String webuser;
@Parameter(names = "--password", description = "the password", required = true)
private String stage;
//getters and setters
}
这是实际程序代码开始之前发生的所有事情。
编辑:assylias 更新的答案解决了问题。
下面的程序根据您的要求抛出异常:
class Params {
@Parameter(names = "--user", description = "the User")
String user;
@Parameter(names = "--password", description = "the password")
String password;
}
public static void main(String[] args) {
Params p = new Params();
new JCommander(p).parse("--user hugo david --password secret".split(" "));
System.out.println(p.user);
System.out.println(p.password);
}
如果删除 david
,程序会按预期打印 hugo 和 secret。
更新
在您发布的代码中,您有:
@Parameter
private List<String> parameters = new ArrayList<>();
如果您阅读 javadoc for the names
attribute of the Parameter
annotation,您会发现(强调我的)它是:
An array of allowed command line parameters (e.g. "-d", "--outputdir", etc...). If this attribute is omitted, the field it's annotating will receive all the unparsed options.
因此命令“david”最终出现在 parameters
列表中。如果您想要异常,则需要删除该参数。
根据 JCommander 文档,您可以添加自定义参数验证,例如:
public class SingleValue implements IParameterValidator {
public void validate(String name, String value) throws ParameterException {
String[] values = value.split(" ");
if (values.length > 1)
{
throw new ParameterException("Parameter " + name + " should hold no more than one value, (found " + value +")");
}
}
}
那么您的变量声明将如下所示:
@Parameter(names = "user", description = "the User", validateWidth = SingleValue.class)
private String user;
当传递“--user hugo david --password secret”时应该抛出异常,但当传递“--user hugo --password secret”时不会抛出异常
我正在使用 JCommander 1.48,我遇到了以下问题:
例如我有这些参数:
@Parameter(names = "user", description = "the User")
private String user;
@Parameter(names = "password", description = "the password")
private String password
我是 运行 我的程序,参数如下:
--user hugo --password secret
和:
--user hugo david --password secret
两者是同一个解决方案,程序运行完美。但是我希望程序在参数值太多时抛出异常。我知道 "arity"(参数值的数量)作为 @Parameter 注释的配置,但字符串的默认值 arity 是 1 allready。似乎在第一个值之后一切都被忽略了,只要它不是另一个参数。
有什么解决方案或想法吗?
编辑:
基本解决方案(由 assylias 发布)对我不起作用。更准确的示例:
public class MyTestProgram {
private final Params options;
public MyTestProgram(String[] args) {
options = new Params();
new JCommander(options).parse("--user hugo david --password secret".split(" "));
//pass "args" to parse() instead of hardcoded string.
}
public static void main(String[] args) throws Exception {
System.setProperty("org.jboss.logging.provider", "slf4j");
new MyTestProgram(args);
}
}
public class Params {
@Parameter
private List<String> parameters = new ArrayList<>();
@Parameter(names = "--user", description = "the user", required = true)
private String webuser;
@Parameter(names = "--password", description = "the password", required = true)
private String stage;
//getters and setters
}
这是实际程序代码开始之前发生的所有事情。
编辑:assylias 更新的答案解决了问题。
下面的程序根据您的要求抛出异常:
class Params {
@Parameter(names = "--user", description = "the User")
String user;
@Parameter(names = "--password", description = "the password")
String password;
}
public static void main(String[] args) {
Params p = new Params();
new JCommander(p).parse("--user hugo david --password secret".split(" "));
System.out.println(p.user);
System.out.println(p.password);
}
如果删除 david
,程序会按预期打印 hugo 和 secret。
更新
在您发布的代码中,您有:
@Parameter
private List<String> parameters = new ArrayList<>();
如果您阅读 javadoc for the names
attribute of the Parameter
annotation,您会发现(强调我的)它是:
An array of allowed command line parameters (e.g. "-d", "--outputdir", etc...). If this attribute is omitted, the field it's annotating will receive all the unparsed options.
因此命令“david”最终出现在 parameters
列表中。如果您想要异常,则需要删除该参数。
根据 JCommander 文档,您可以添加自定义参数验证,例如:
public class SingleValue implements IParameterValidator {
public void validate(String name, String value) throws ParameterException {
String[] values = value.split(" ");
if (values.length > 1)
{
throw new ParameterException("Parameter " + name + " should hold no more than one value, (found " + value +")");
}
}
}
那么您的变量声明将如下所示:
@Parameter(names = "user", description = "the User", validateWidth = SingleValue.class)
private String user;
当传递“--user hugo david --password secret”时应该抛出异常,但当传递“--user hugo --password secret”时不会抛出异常