Jira 插件:通过数据库动态填充选择的自定义字段

如何解决Jira 插件:通过数据库动态填充选择的自定义字段

我一直在尝试使用 Java 制作 Jira 插件,以尝试使用数据库动态填充 SelectCFType。我目前从我找到的一些代码中获得了一个可用的 SelectCFType here。唯一的问题是我不知道从哪里开始通过数据库填充它。我尝试手动填充一次,但 Jira 在创建票证时给了我一个错误,因为自定义字段的内部数据库中存储的值与我提供的值不同。任何帮助将不胜感激!

Java 类

import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.customfields.impl.SelectCFType;
import com.atlassian.jira.issue.customfields.manager.OptionsManager;
import com.atlassian.jira.issue.customfields.option.Option;
import com.atlassian.jira.issue.customfields.option.Options;
import com.atlassian.jira.issue.fields.config.FieldConfigScheme;
import com.atlassian.jira.issue.fields.rest.json.beans.JiraBaseUrls;
import com.atlassian.jira.issue.search.SearchContextImpl;
import org.apache.commons.collections.MultiMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.atlassian.jira.issue.customfields.manager.GenericConfigManager;
import com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.fields.config.FieldConfig;
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem;
import com.atlassian.plugin.spring.scanner.annotation.imports.Jiraimport;

import javax.inject.Inject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DynamicSelectCF extends SelectCFType{
        private static final Logger log = LoggerFactory.getLogger(DynamicSelectCF.class);
        private final OptionsManager optionsManager;
    
        private final JiraBaseUrls jiraBaseUrls;
        @Inject
        public DynamicSelectCF(@Jiraimport CustomFieldValuePersister customFieldValuePersister,@Jiraimport OptionsManager optionsManager,@Jiraimport GenericConfigManager genericConfigManager,@Jiraimport JiraBaseUrls jiraBaseUrls){
            super(customFieldValuePersister,optionsManager,genericConfigManager,jiraBaseUrls);
            this.optionsManager = optionsManager;
            this.jiraBaseUrls = jiraBaseUrls;
        }
    
        @Override
        public Map<String,Object> getVeLocityParameters(final Issue issue,final CustomField field,final FieldLayoutItem fieldLayoutItem) {
    
            final Map<String,Object> parameters = super.getVeLocityParameters(issue,field,fieldLayoutItem);
    
            FieldConfig fieldConfiguration = null;
    
            if(issue == null)
            {
                fieldConfiguration = field.getReleventConfig(new SearchContextImpl());
            } else
            {
                fieldConfiguration = field.getRelevantConfig(issue);
            }
            Options options = this.optionsManager.getoptions(fieldConfiguration);
            if (options.isEmpty()) {
                this.optionsManager.createOption(fieldConfiguration,null,new Long(1),"A");
                this.optionsManager.createOption(fieldConfiguration,new Long(2),"B");
            }
            options = this.optionsManager.getoptions(fieldConfiguration);
            Map<Long,String> results = new HashMap<Long,String>();
    
            Long selectedId= (long) -1;
            boolean selected = false;
            Object value = field.getValue(issue);
            if (value!=null) {
                selected=true;
            }
            for (Option option : (Iterable<Option>) options) {
                results.put(option.getoptionId(),option.getValue());
                if (selected && value.toString().equals(option.getValue())) {
                    selectedId = option.getoptionId();
                }
            }
    
            parameters.put("results",results);
            parameters.put("selectedId",selectedId);
            return parameters;
        }
    }

edit.vm(用于网络资源)

#* @vtlvariable name="results" type="java.util.Map" *#
#* @vtlvariable name="selectedId" type="java.lang.String" *#
#controlHeader ($action $customField.id $customField.name $fieldLayoutItem.required $displayParameters.noHeader)

<select name="$customField.id" id="$customField.id" >
<option value="-1">Not selected</option>
#foreach ($mapEntry in $results.entrySet())
#if ( $selectedId == $mapEntry.key )
<option selected="selected" value="$mapEntry.key">$mapEntry.value</option>
#else
<option value="$mapEntry.key">$mapEntry.value</option>
#end
#end
</select>

#controlFooter ($action $fieldLayoutItem.fieldDescription $displayParameters.noHeader)

解决方法

所以我想我想出了一个很好的方法来做到这一点。我创建了一个方法,到目前为止效果很好。

public void populatingOprions(FieldConfig fieldConfiguration,ArrayList<String> optionPopulation){            
        for (int i = 0; i < population.size(); i++){
            this.optionsManager.createOption(fieldConfiguration,null,new Long(i),optionPopulation.get(i));
        }
        hasBeenCalled = true;
    }

在 getVelocityParameters 方法中,我在 if(options.isEmpty()) 语句下添加了此代码

if(!hasBeenCalled) {
    String arr[] = {"---------------","This","Is","Just","A","Test","For","Population"};
    for(int i = 0; i < arr.length; i++){
        population.add(arr[i]);
    }
    populatingOprions(fieldConfiguration,population);
}

我有一个保存所有值的 ArrayList,我认为我们有一个 mySQL 数据库,它看起来很容易从中获取数据。 hasBeenCalled 是一个布尔值,用于跟踪该方法是否已经被调用以填充 SelectCF 的选项,因此它不会重复它们。

,

完全不是要阻止您享受编写 Jira 插件的乐趣,但您几乎没有其他选择

  1. https://marketplace.atlassian.com/apps/23337/elements-connect-external-data-fields?hosting=cloud&tab=overview
  2. 您也可以使用 ScriptRunner 编写脚本来执行此操作

我们使用第二种方法用来自公司 REST API 的数据填充单行文本字段。感觉就像使用预先输入的字段,例如组件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?