【问题标题】:Jenkins: doFill Function doesn't fetch @QueryParameter properlyJenkins:doFill 函数无法正确获取 @QueryParameter
【发布时间】:2014-09-08 12:56:18
【问题描述】:

过去 2 天我一直在为这个问题摸不着头脑,但一直没有找到解决方案...

基本上,我有一个有两个下拉列表(果冻标签)的插件。其中之一是填充所有可用的项目类型,另一个应该填充适用于先前选择的项目类型的构建器。我正在针对 Jenkins 版本 1.578 构建插件。

这是我的配置果冻:

<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:entry title="Projectname" field="projectName">
    <f:textbox />
  </f:entry>
  <f:entry title="Build project after creation?" field="runProjectAfterCreation">
    <f:checkbox />
  </f:entry>

  <f:entry title="Project configuration">
    <f:entry title="Project / Job Type" field="projectType">
      <f:select default="noTypeSelected" name="projectType"/>
    </f:entry>

    <f:entry title="Build Steps">
      <f:repeatable var="buildSteps" items="buildSteps" minimum="1">
        <table width="100%" bgcolor="#EEEEEE">
          <div width="100%">
            <f:entry field="buildStepType">
              <f:select default="noBuildStepSelected" />
              <f:repeatableDeleteButton value="Delete Build Step" />
            </f:entry>
          </div>
        </table>
      </f:repeatable>
    </f:entry>

  </f:entry>
</j:jelly>

使用这个函数可以很好地填充 projectType 下拉列表:

public ListBoxModel doFillProjectTypeItems() {
    ListBoxModel items = new ListBoxModel();
    items.add( "Bitte Projekttyp wählen", "noTypeSelected" );
    for ( TopLevelItemDescriptor tliDescriptor : getAvailableJobTypes() ) {
        items.add( tliDescriptor.getDisplayName(), tliDescriptor.getId() );
    }
    return items;

}

但是 buildStepType 没有。

public ListBoxModel doFillBuildStepTypeItems( @QueryParameter( "../projectType" ) final String projectType ) {
    ListBoxModel items = new ListBoxModel();
    if ( ( !projectType.equals( "noTypeSelected" ) ) && ( !projectType.equals( "hudson.maven.MavenModuleSet" ) ) ) {
        try {
            for ( BuildStepDescriptor<? extends Builder> buildStep : getAvailableBuilders( (Class<? extends AbstractProject<?, ?>>) Class
                    .forName( projectType ).asSubclass( AbstractProject.class ) ) ) {
                items.add( buildStep.getDisplayName(), buildStep.getId() );
            }
        } catch ( ClassNotFoundException ex ) {
            throw new RuntimeException( ex );
        }
        // Maven projects will throw a java.lang.ClassNotFoundException
    } else if ( projectType.equals( "hudson.maven.MavenModuleSet" ) ) {
        items.add( "Mavenprojects are not supported!", "mavenSelected" );
    } else {
        items.add( "Choose project type first, please!", "noProjectType" );
    }
    return items;
}

java.lang.reflect.InvocationTargetException 是由以下行中的 NullPointerException 引起的:

if ( ( !projectType.equals( "noTypeSelected" ) ) && ( !projectType.equals("hudson.maven.MavenModuleSet" ) ) )

因为 projectType 为空。显然@QueryParameter 没有从第一个下拉列表中获取选定的值。但它确实“知道它在那里”,因为当我选择一个新的项目类型时会调用该函数。

有人知道解决这个问题的方法吗?

【问题讨论】:

    标签: java jenkins jenkins-plugins jelly


    【解决方案1】:

    希望这个答案还不算太晚。

    你可以看到

    https://github.com/jenkinsci/jenkins/blob/jenkins-1.578/core/src/main/java/hudson/RelativePath.java

    这是用法:

    public ListBoxModel doFillBuildStepTypeItems( 
    @QueryParameter("projectType") @RelativePath("..") 
    final String projectType ) {...}
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多