Jenkins表单验证使用对象作为参数



我正在为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 {

这允许我至少检查变量是否设置。但是,对于您的用例来说,这可能还不够。