2

我正在 JIRA 中开发自己的自定义字段类型。我的类很简单,它扩展了 GenericTextCFType。我的目标是在数据库中存储一些字段值的标识符 (ID),但在问题表单上显示字段值的人类可读标题。

我搜索了 GenericTextCFType 类的方法,找到了 getSingularObjectFromString 方法,但我不明白它的作用。JIRA javadoc 说:“给定表示层传递的字符串值,返回一个奇异对象” 但是什么是奇异对象,它需要什么?

4

1 回答 1

5

是的,这不是一个好名字。我在 "Practical JIRA Plugins" (O'Reilly) 中详细描述了它。这是那里的摘录,详细描述了许多方法(对格式感到抱歉)。这本书还在https://bitbucket.org/mdoar/practical-jira-plugins上提供了工作示例

CustomFieldType 方法 该示例的自定义字段类型类将像往常一样实现 CustomFieldType 接口,但将在继承层次结构中扩展一个比 NumberCFType 更高的类。我们将扩展的类是 AbstractCustomFieldType,它是大多数实现 CustomFieldType 的类的根。

名称中带有“SingularObject”的 CustomFieldType 接口中的方法指的是单数对象,在本示例中为 Carrier 对象。JIRA 4 自定义字段中引用 Object 的所有其他方法都引用传输对象,例如,Carrier 对象的集合。JIRA 5 在大多数自定义字段方法中删除了 Object 的使用。有关 JIRA 5.0 中带有自定义字段的更改的更多信息,请参阅https://developer.atlassian.com/display/JIRADEV/Java+API+Changes+in+JIRA+5.0#JavaAPIChangesinJIRA5.0-CustomFieldTypes。类层次结构发生了一些重大变化,大多数类现在都将 Java 泛型作为参数,而不是像以前那样仅使用 Object。

有两个对象通常被注入到自定义字段类型类的构造函数中。第一个是 CustomFieldValuePersister 持久对象,它将与数据库进行实际交互。第二个是 GenericConfigManager 对象,用于存储和检索自定义字段的默认值。其他对象根据需要注入到构造函数中——例如,示例 2-2 中的 DoubleConverter。要考虑的第一组方法是自定义字段类型用于以某种方式与数据库交互的方法。

getSingularObjectFromString()

此方法将从数据库中获取的字符串(例如“42.0###The answer”)转换为 Carrier 对象。空值意味着没有定义这样的对象。

具有多个值的字段

Collection<Carrier> getValueFromIssue(CustomField field, Issue issue)

这是提取给定问题的字段包含内容的主要方法。它使用持久化器从数据库中检索问题的值,将每个值转换为一个 Carrier 对象,然后将所有 Carrier 对象放入一个传输对象集合中。空值表示该字段没有为给定问题存储的值。这是在 JIRA 5.0 之前用于返回对象的方法之一

createValue(CustomField field, Issue issue, Collection<Carrier> value)
updateValue(CustomField field, Issue issue, Collection<Carrier> value)

这些方法为给定问题中的字段创建新值或更新现有值。执行此操作的持久化器期望存储一个字符串集合,因此这两个方法都调用方法 getDbValueFromCollection 来帮助解决这个问题。

getDbValueFromCollection()

在许多自定义字段类型类中发现的私有便捷方法,有时名称不同。它用于将传输对象(例如,Carrier 对象集合)转换为字符串集合以存储在数据库中。

setDefaultValue(FieldConfig fieldConfig, Collection<Carrier> value)

将传输对象(Carrier 对象的集合)转换为其数据库表示形式,并将其存储在数据库中的通用配置表中。

Collection<Carrier> getDefaultValue(FieldConfig fieldConfig)

从数据库中检索默认值(如果有)并将其转换为传输对象(Carrier 对象的集合)。FieldConfig 对象代表自定义字段中每个默认值的上下文。

下一组要考虑的方法是以某种方式与网页交互的方法。来自网页的所有值都作为自定义 FieldParams 对象的一部分到达自定义字段类型对象,该对象是 HTML 输入元素值的 Map 的持有者。

validateFromParams(CustomFieldParams params, ErrorCollection errors, FieldConfig config)

这是用户编辑自定义字段值后调用的第一个方法。此处记录的任何错误都会很好地显示在编辑页面中的字段旁边。

getValueFromCustomFieldParams(CustomFieldParams customFieldParams)

此方法用于清除已被 validate FromParams 接受的字段的新值并将其转换为传输对象。自定义 FieldParams 对象将只包含 HTML 元素的字符串,其名称属性是自定义字段 ID,例如 customfield_10010。空值表示该字段没有值。

getStringValueFromCustomFieldParams(CustomFieldParams parameters)

此方法返回一个对象,该对象可能是字符串、字符串集合甚至是 CustomFieldParams 对象。它用于填充第 3 章中使用的 value 变量:高级自定义字段类型 Velocity 模板。它还用于自定义字段搜索器使用的 Provider 类。

String getStringFromSingularObject(Carrier singularObject)

如您所料,此方法与 getSingularObjectFromString 不同。相反,它用于将单个对象(Carrier)转换为网页中使用的字符串,而不是数据库值。返回的字符串有时也是存储在 Lucene 索引中用于搜索的内容(第 57 页的“更复杂的搜索器”)。在 JIRA 5.0 之前,单个对象作为对象传递到此方法中。

要考虑的最后一组 CustomFieldType 方法是:

Set<Long> remove(CustomField field)

当自定义字段从 JIRA 实例中完全删除时调用此方法,并返回受删除影响的问题 ID。用于从字段中删除值的正确方法是 updateValue。

String getChangelogValue(CustomField field, Object value)
String getChangelogString(CustomField field, Object value)

这些方法是生成问题历史选项卡中的文本的方式。当此类型的自定义字段发生更改时,这些方法将使用该字段的前后值调用。这两种方法的区别在于,如果稍后的值变为无效,则会显示字符串(https://developer.atlassian.com/display/JIRADEV/Database+Schema#DatabaseSchema-ChangeHistory)。

extractTransferObjectFromString()
extractStringFromTransferObject()

这些方法不是来自 CustomFieldType 接口,但它们存在于标准的 Multi 字段中,以便在项目导入期间使用。

其他接口

还有一些其他接口通常由自定义字段类型实现。

ProjectImportableCustomField

此接口中的 getProjectImporter 方法用于实现在从 XML 备份导入项目期间如何填充自定义字段。如果您不实现此接口,则项目导入将不会为您的自定义字段导入值。

MultipleCustomFieldType
MultipleSettableCustomFieldType

这两个接口由带有选项的自定义字段使用,并且可以有多个选项。对于这些类,可以使用 Options 类来访问这些值,该类是 Java List 的一个简单子类。这些接口并非真正旨在供通用多值自定义字段类型使用。

具有多个值的字段 | 41

SortableCustomField

这个接口包含一个比较两个奇异对象的比较方法。当您单击列标题对一页问题进行排序时,问题导航器会使用此选项。对于没有关联搜索器的自定义字段,这实际上是一个较慢的回退(参见第 4 章)。

RestAwareCustomFieldType
RestCustomFieldTypeOperations

这两个接口是 JIRA REST API 如何知道可以检索或更新哪些字段的。JIRA 5.0 中的新功能。

于 2013-07-29T17:38:21.343 回答