Дженкинс: функция doFill неправильно выбирает @QueryParameter
Последние 2 дня я ломал голову над этим, но не смог найти решение...
По сути, у меня есть плагин, который имеет два раскрывающихся списка (желейные теги). Один из них заполняется всеми доступными типами проектов, другой должен быть заполнен строителями, которые применимы к ранее выбранному типу проекта. Я строю плагин против Дженкинс версии 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
не извлекает выбранное значение из первого раскрывающегося списка. Однако он "знает, что он есть", так как функция вызывается, когда я выбираю новый тип проекта.
Кто-нибудь знает решение этой проблемы?
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 ) {...}