无法理解,getSingularObjectFromString方法有什么作用?

时间:2013-07-29 13:27:50

标签: jira jira-plugin

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

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

1 个答案:

答案 0 :(得分:5)

是的,它不是一个好名字。我在" Practical JIRA Plugins"中详细描述了它。  (O' Reilly的)。这里有一个摘录,详细描述了许多方法(抱歉格式化)。这本书也有https://bitbucket.org/mdoar/practical-jira-plugins

提供的工作范例

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

CustomFieldType接口中名称中带有“SingularObject”的方法引用单个对象,在此示例中为Carrier对象。 JIRA 4自定义字段中引用Object的所有其他方法都是指传输对象,例如Carrier对象的Collection。 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 persister对象,它实际上将与数据库进行交互。第二个是GenericConfigManager对象,用于存储和检索自定义字段的默认值。其他对象根据需要注入构造函数 - 例如,示例2-2中的DoubleConverter。 要考虑的第一组方法是自定义字段类型用于以某种方式与数据库交互的方法。

getSingularObjectFromString()

此方法将从数据库中取出的字符串(如“42.0 ### The answer”)转换为Carrier对象。空值表示没有定义此类对象。

具有多个值的字段

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

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

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

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

getDbValueFromCollection()

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

setDefaultValue(FieldConfig fieldConfig, Collection<Carrier> value)

将传输对象(Carrier对象的Collection)转换为其数据库表示,并将其存储在generic configuration配置表的数据库中。

Collection<Carrier> getDefaultValue(FieldConfig fieldConfig)

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

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

validateFromParams(CustomFieldParams params, ErrorCollection errors, FieldConfig config)

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

getValueFromCustomFieldParams(CustomFieldParams customFieldParams)

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

getStringValueFromCustomFieldParams(CustomFieldParams parameters)

此方法返回一个对象,该对象可以是String,字符串集合甚至是CustomFieldParams对象。它用于填充第3章:高级自定义字段类型速度模板中使用的值变量。它也用在自定义字段搜索者使用的Provider类中。

String getStringFromSingularObject(Carrier singularObject)

此方法与getSingularObjectFromString没有任何直接相反的效果。相反,它用于将单个对象(Carrier)转换为网页中使用的字符串,而不是数据库值。返回的String有时也会存储在用于搜索的Lucene索引中(第57页的“更复杂的搜索者”)。在JIRA 5.0之前,单个对象作为Object传递给此方法。

要考虑的最后一组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中的新功能。