我正在为Jenkins构建一个插件,我正在尝试验证我的表单(连接测试方法)。当所有@QueryParameter
都是字符串时,这工作得很好。
现在我试图发送我的表单验证方法一个对象,像这样:
public FormValidation doTestConnection(
@QueryParameter("url") final String url,
@QueryParameter("timeout") final String timeout,
@QueryParameter("bypassProxy") final boolean bypassProxy,
@QueryParameter("deployerCredentialsConfig") final CredentialsConfig deployerCredentialsConfig,
@QueryParameter("resolverCredentialsConfig") final CredentialsConfig resolverCredentialsConfig
) throws ServletException {
在我的全局。果冻文件如下:
<f:validateButton
title="${%Test Connection}" progress="${%Testing...}"
method="testConnection"
with="url,timeout,bypassProxy,deployerCredentialsConfig,resolverCredentialsConfig"/>
我的CredentialConfig
类实现Serializable
,但我想这是不够的,因为我得到这个时,点击"测试连接"按钮:
java.lang.IllegalArgumentException: Failed to invoke public hudson.util.FormValidation
org.jfrog.hudson.MyBuilder$ descriptorimplp . dotestconnection (java.lang.String,java.lang.String,boolean,org.jfrog.hudson.CredentialsConfig,org.jfrog.hudson.CredentialsConfig)抛出javaxs .servlet. servletexception
Jenkins没有关于在FormValidation调用中使用对象的良好文档。
查看Jenkins文档和
文档说(https://wiki.jenkins-ci.org/display/JENKINS/Jelly+form+controls):
'with'属性指定发送到服务器的输入字段验证。它们与字段属性或其他输入控件的Name属性。最接近的值上面的输入字段被发送到服务器,因此这意味着按钮必须出现在输入字段之后。多个可以使用','来指定字段。
代码只是通过名称获取字段-没有"对象汇编"(我相信它只在实际配置提交时完成)。
https://github.com/jenkinsci/jenkins/blob/96ec7a267e0efba2ec99590c871db0940e35920f/war/src/main/webapp/scripts/hudson-behavior.js L2856
我碰到了一个类似的问题。查看代码,似乎stapler试图将参数转换为您在doCheck
函数声明中提供的类型。
class HandlerImpl extends AnnotationHandler<QueryParameter> {
public Object parse(StaplerRequest request, QueryParameter a, Class type, String parameterName) throws ServletException {
String name = a.value();
if(name.length()==0) name=parameterName;
if(name==null)
throw new IllegalArgumentException("Parameter name unavailable neither in the code nor in annotation");
String value = request.getParameter(name);
if(a.required() && value==null)
throw new ServletException("Required Query parameter "+name+" is missing");
if(a.fixEmpty() && value!=null && value.length()==0)
value = null;
return convert(type,value); // <--- HERE
}
}
作为解决方法,我将类型更改为布尔型,如下所示:
public FormValidation doTestConnection(
@QueryParameter("url") final String url,
@QueryParameter("timeout") final String timeout,
@QueryParameter("bypassProxy") final boolean bypassProxy,
@QueryParameter("deployerCredentialsConfig") final boolean deployerCredentialsConfig,
@QueryParameter("resolverCredentialsConfig") final boolean resolverCredentialsConfig
) throws ServletException {
这允许我至少检查变量是否设置。但是,对于您的用例来说,这可能还不够。