【问题标题】:How do I save a value into a custom field in JIRA programmatically?如何以编程方式将值保存到 JIRA 中的自定义字段中?
【发布时间】:2012-01-05 07:37:37
【问题描述】:

我花了几天时间试图找出如何以编程方式将值保存或更新到 CustomField 中,最后发现了它是如何完成的。所以我会提出这个问题然后回答它,因为我很想有这个问题和答案。

关于如何在 JIRA 中保存或更新自定义字段的值的文档存在冲突。我正在使用:

customField.setCustomFieldValue(CustomField, value);

这不会将值保存到数据库中,但据我所知,它确实会更新值。仅当您在工作流发布功能转换中进一步使用 CustomField 时,它才有用。

我正在使用 Jira 4.3.2。

如何将 CustomFields 值保存到 JIRA 数据库中?

【问题讨论】:

    标签: java jira jira-plugin atlassian-plugin-sdk


    【解决方案1】:

    好的,这就是我成功更新 CustomField 值并将其保存到 JIRA db 中的方式。

    欢迎评论...

    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。
    • 我在这里问一个问题,因为我不想创建一个副本。使用上述解决方案,我可以将自定义字段数据保存到数据库中,但在创建问题时自定义字段值未出现在查看问题页面上?但是刷新页面时会显示!!我确定为什么需要这种额外的刷新?你能强调一下吗?
    • 我有一个问题。如果我不想改变问题的价值,但我只想更新一个自定义字段的选项怎么办。我的意思是从一个自定义字段中选择值并更新到另一个?
    • 我认为这不再有效,并且这一行包含不推荐使用的方法:ComponentManager.getInstance().getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem( customField);
    • docs.atlassian.com/software/jira/docs/api/7.6.1/… ComponentManager 被替换为 ComponentAccessor docs.atlassian.com/software/jira/docs/api/7.6.1/com/atlassian/… 所以:ComponentAccessor.getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem(customField);
    【解决方案2】:

    这是我的做法(对于我以编程方式存储随机 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-Object。

    【讨论】:

    • 如果您必须填充选择列表自定义字段并且选择列表中不存在新值怎么办?
    • 那么,updateValuefieldLayoutItem 参数可以为空吗?我想知道,这意味着什么——为什么没有这种论点就没有updateValue 的形式......
    • fieldLayoutItem 用于确定渲染器 - 如果它为 null,它将回退到文本渲染器。
    【解决方案3】:

    这里有一个适用于我在 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);
    

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,并使用 this plugin 解决了它,fyi=)

      【讨论】:

      • 链接已损坏,但插件仍然作为常用的 JIRA Suite Utilities 存在
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多