Java 如何在构建步骤中使用optionalBlock';s config.jelly
我在创建构造函数时遇到了问题,Jenkins可以调用来自Jelly表单的一些JSON数据,。为了进行测试,我使用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="
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">