如何通过程序将值保存到JIRA自定义字段中?

14

我花了好几天的时间试图找到如何通过编程保存或更新CustomField中的值,最终找到了解决方法。因此我将把这个问题作为一个问题来提出,并回答它,正如我曾经希望有这个问题和答案。

关于在JIRA中保存或更新自定义字段的值,有一些文档存在矛盾。我一直在使用:

customField.setCustomFieldValue(CustomField, value);

这并不会将值保存到数据库中,但据我所知它确实更新了该值。仅当您在后续的工作流程后置功能转换(例如)中进一步使用CustomField时才有用。

我正在使用Jira 4.3.2。

如何将CustomFields的值持久化到JIRA数据库中?

4个回答

17

好的,这就是我成功地将CustomField值更新并保存到JIRA数据库中的方法。

欢迎评论...

private void saveValue(MutableIssue issue, String valueToSave, CustomField
        customField) throws FieldLayoutStorageException {

    issue.setCustomFieldValue(customField, valueToSave);

    Map<String, ModifiedValue> modifiedFields = issue.getModifiedFields();

    FieldLayoutItem fieldLayoutItem =
    ComponentManager.getInstance().getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem(
            customField);

    DefaultIssueChangeHolder issueChangeHolder = new DefaultIssueChangeHolder();

    final ModifiedValue modifiedValue = (ModifiedValue) modifiedFields.get(customField.getId());

    customField.updateValue(fieldLayoutItem, issue, modifiedValue, issueChangeHolder);
}

我会在方法外部执行setCustomFieldValue,这样你就不必将valueToSave固定为String类型。 - lilalinux
我在这里直接提出一个问题,因为我不想创建重复的内容。使用上述解决方案,我能够将自定义字段数据保存到数据库中,但是当创建问题时,在查看问题页面上没有显示自定义字段值?但是当刷新页面时,它会显示出来!!我不确定为什么需要额外的刷新?你能否对此进行一些说明? - Sukane
我有一个问题。如果我不想将值更改为问题,而只想更新一个自定义字段的选项,该怎么办?我的意思是从一个自定义字段中选择值并更新到另一个自定义字段中? - Mohammad Adnan
我认为这个不再起作用了,而且这一行包含已弃用的方法:ComponentManager.getInstance().getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem( customField); - JBaczuk
组件管理器被 ComponentAccessor 替换 https://docs.atlassian.com/software/jira/docs/api/7.6.1/com/atlassian/jira/component/ComponentAccessor.html 因此:ComponentAccessor.getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem(customField); - yan

3
这是我处理它的方法(对于我以编程方式存储随机UUID的自定义字段):
CustomField cfHash = customFieldManager.getCustomFieldObjectByName(...);
IssueChangeHolder changeHolder = new DefaultIssueChangeHolder();
try {
    Object newHashValue = java.util.UUID.randomUUID().toString();
    Object oldHashValue = issue.getCustomFieldValue(cfHash);

    issue.setCustomFieldValue(cfHash, newHashValue);
    cfHash.updateValue(null, issue, new ModifiedValue(oldHashValue, newHashValue), changeHolder);
...

与您基本相同,但有另一种获取ModifiedValue对象的方法。


如果您需要填充一个选择列表自定义字段,但新值不在选择列表中怎么办? - Mohammad Adnan
那么,updateValuefieldLayoutItem 参数可以为空吗?我在想,这是什么意思 -- 为什么没有不带该参数的 updateValue 形式... - Mikhail T.
fieldLayoutItem 用于确定渲染器 - 如果为 null,则会回退到文本渲染器。 - LukeSolar

0

这是在 JIRA 6.4.7 中适用于我更新自定义字段值的解决方案。实际上,我正在更新单选字段,因此必须获取其 Option

MutableIssue issue = issueManager.getIssueByCurrentKey(issueKey); 
FieldConfig relevantConfig = customField.getRelevantConfig(issue);
// if you use a text field use String. or double for numeric
Option optionForValue = optionsManager.getOptions(relevantConfig).getOptionForValue(option, null);
issue.setCustomFieldValue(customField,optionForValue);
Map<String, ModifiedValue> modifiedFields = issue.getModifiedFields();
FieldLayoutItem fieldLayoutItem =
fieldLayoutManager.getFieldLayout(issue).getFieldLayoutItem(customField);
DefaultIssueChangeHolder issueChangeHolder = new DefaultIssueChangeHolder();
final ModifiedValue modifiedValue = modifiedFields.get(customField.getId());
customField.updateValue(fieldLayoutItem, issue, modifiedValue, issueChangeHolder);

-1

我曾经遇到同样的问题,使用了这个插件解决了,FYI=)


链接已经失效,但是作为常用的JIRA Suite Utilities插件仍然存在。 - mdoar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接