Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在构建步骤中使用optionalBlock';s config.jelly_Java_Jenkins_Hudson_Jelly - Fatal编程技术网

Java 如何在构建步骤中使用optionalBlock';s config.jelly

Java 如何在构建步骤中使用optionalBlock';s config.jelly,java,jenkins,hudson,jelly,Java,Jenkins,Hudson,Jelly,我在创建构造函数时遇到了问题,Jenkins可以调用来自Jelly表单的一些JSON数据,。为了进行测试,我使用mvn hpi:create和以下两个自定义文件创建了一个最小的Jenkins插件: src/main/resources/foo/hyde/jenkins/plugins/OptionalBlockSampleBuilder/config.jelly <j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="

我在创建构造函数时遇到了问题,Jenkins可以调用来自Jelly表单的一些JSON数据,。为了进行测试,我使用
mvn hpi:create
和以下两个自定义文件创建了一个最小的Jenkins插件:

src/main/resources/foo/hyde/jenkins/plugins/OptionalBlockSampleBuilder/config.jelly

<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<f:block>
    <table>
        <f:optionalBlock name="enableText" title="Enable optional text" checked="${instance.enableText}">
            <f:entry title="Optional text" field="text">
                <f:textbox />
            </f:entry>
        </f:optionalBlock>
    </table>
</f:block>

必须有一个简单的解决办法。我尝试了许多不同的更改,也尝试了查看其他插件如何使用它,最后创建了这个最小的测试插件。如何修复它以使optionalBlock工作?

提示来自JSON数据:

{
"enableText":{"text":"xx"},
"kind":"foo.hyde.jenkins.plugins.OptionalBlockSampleBuilder",
"stapler-class":"foo.hyde.jenkins.plugins.OptionalBlockSampleBuilder"
}
您可以在这里看到,
enableText
包含一个子属性,
text
。这意味着实际需要对块中包含的所有字段进行封装——当检查块时,您将收到封装字段类的实例;未选中时,该字段将为
null
。要正确使用
optionalBlock
,需要
@DataBoundConstructor
接受一个可为空的类实例,该实例封装了整个
optionalBlock
。例如:

private String text;

@DataBoundConstructor
public MyClass(EnableTextBlock enableText)
{
    if (enableText != null)
    {
        this.text = enableText.text;
    }
}

public static class EnableTextBlock
{
    private String text;

    @DataBoundConstructor
    public EnableTextBlock(String text)
    {
        this.text = text;
    }
}
请注意,本例中的
enableText
字段实际上是
EnableTextBlock
类的一个实例,该类包含一个子属性
text
。这将满足以表单形式发送的JSON对象


相反,如果您需要的是一个单一字段,它有一个复选框来启用该字段的输入,那么您可能需要考虑使用标签,它将为您处理该字段的封装。然而,在许多情况下,配置多个字段实际上需要使用

optionalBlock
,在这种情况下,封装类(如上面的示例)通常是正确的方法


封装类不必是静态内部类;它可以是包中的一个单独的类,但重要的是,
DataBoundConstructor
应该接受一个与表单传递的JSON结构相匹配的参数。

或者您可以向optionalBlock添加
inline
标记,如下所示:

<f:optionalBlock inline="true">

如果存在
inline
,则在提交时,可折叠部分不会分组到单独的JSON对象中

private String text;

@DataBoundConstructor
public MyClass(EnableTextBlock enableText)
{
    if (enableText != null)
    {
        this.text = enableText.text;
    }
}

public static class EnableTextBlock
{
    private String text;

    @DataBoundConstructor
    public EnableTextBlock(String text)
    {
        this.text = text;
    }
}
<f:optionalBlock inline="true">