@@ -29,12 +29,14 @@ import com.atlassian.jira.issue.fields.rest.json.beans.JiraBaseUrls
2929import com.atlassian.jira.rest.v2.issue.IncludedFields
3030import com.atlassian.jira.rest.v2.issue.IssueBean
3131import com.atlassian.jira.rest.v2.issue.builder.BeanBuilderFactory
32- import com.google.gson.*
32+ import com.fasterxml.jackson.databind.JsonNode
33+ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
34+ import com.google.gson.JsonObject
35+ import com.google.gson.JsonParser as GsonJsonParser
3336import com.linkedplanet.kotlinjiraclient.api.model.IssueQueryParams
3437import com.linkedplanet.kotlinjiraclient.sdk.field.FieldAccessorImpl
3538import org.slf4j.LoggerFactory
3639import javax.ws.rs.core.UriBuilder
37- import javax.xml.bind.annotation.XmlTransient
3840
3941/* *
4042 * Converts a Jira Issue to Json.
@@ -65,8 +67,6 @@ class IssueJsonConverter {
6567 }
6668 private val jiraBaseUrls: JiraBaseUrls = ComponentAccessor .getComponent(JiraBaseUrls ::class .java)
6769 private val uriBuilder: UriBuilder = UriBuilder .fromPath(jiraBaseUrls.restApi2BaseUrl())
68- private val gson = setupGson()
69-
7070
7171 @Throws(FieldException ::class )
7272 fun createJsonIssue (
@@ -80,7 +80,11 @@ class IssueJsonConverter {
8080 this .addOrderableFieldsToBean(issueBean, issue)
8181 this .addAvailableNavigableFieldsToBean(issueBean, issue)
8282
83- return gson.toJsonTree(issueBean).asJsonObject
83+ // Jackson is the official way now to serialize Beans. GSON will fail due to infinite loops in the model.
84+ val jackson = jacksonObjectMapper()
85+ val jacksonJson: JsonNode = jackson.valueToTree(issueBean)
86+
87+ return GsonJsonParser .parseString(jacksonJson.toString()).asJsonObject // expose as GSON for API compatibility
8488 }
8589
8690 @Throws(FieldException ::class )
@@ -111,17 +115,4 @@ class IssueJsonConverter {
111115 bean.addField(this , json, false )
112116 }
113117 }
114-
115- private fun setupGson () =
116- GsonBuilder ()
117- .setExclusionStrategies(object : ExclusionStrategy {
118- override fun shouldSkipField (f : FieldAttributes ? ): Boolean {
119- return f?.getAnnotation(XmlTransient ::class .java) != null
120- }
121-
122- override fun shouldSkipClass (clazz : Class <* >? ): Boolean {
123- return false
124- }
125- })
126- .create()
127118}
0 commit comments