From 1eb170c1da1cbbafd546da9c59d739465766b880 Mon Sep 17 00:00:00 2001 From: Andreas Grub Date: Wed, 6 May 2026 21:49:28 +0200 Subject: [PATCH] fix: make ApiSpecTask compatible with Gradle Configuration Cache Move objectMapper instantiation from a task instance field into the @TaskAction method. Jackson's ObjectMapper contains non-serializable fields (StdDateFormat, ReentrantLock) that prevent Gradle from caching the task graph, causing 'configuration cache entry discarded' on every build that includes OpenApi3Task, OpenApiTask, or PostmanTask. Since objectMapper is only used inside aggregateResourceModels(), it does not need to be a persistent field on the task instance. Fixes #284 --- .../kotlin/com/epages/restdocs/apispec/gradle/ApiSpecTask.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/restdocs-api-spec-gradle-plugin/src/main/kotlin/com/epages/restdocs/apispec/gradle/ApiSpecTask.kt b/restdocs-api-spec-gradle-plugin/src/main/kotlin/com/epages/restdocs/apispec/gradle/ApiSpecTask.kt index c1c9d610..94a41dd1 100644 --- a/restdocs-api-spec-gradle-plugin/src/main/kotlin/com/epages/restdocs/apispec/gradle/ApiSpecTask.kt +++ b/restdocs-api-spec-gradle-plugin/src/main/kotlin/com/epages/restdocs/apispec/gradle/ApiSpecTask.kt @@ -6,7 +6,6 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction import tools.jackson.databind.DeserializationFeature import tools.jackson.module.kotlin.jacksonMapperBuilder -import tools.jackson.module.kotlin.jacksonObjectMapper import tools.jackson.module.kotlin.readValue import java.io.File @@ -29,8 +28,6 @@ abstract class ApiSpecTask : DefaultTask() { private val snippetsDirectoryFile get() = project.file(snippetsDirectory) - private val objectMapper = jacksonMapperBuilder().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).build() - open fun applyExtension(extension: ApiSpecExtension) { outputDirectory = extension.outputDirectory snippetsDirectory = extension.snippetsDirectory @@ -40,6 +37,8 @@ abstract class ApiSpecTask : DefaultTask() { @TaskAction fun aggregateResourceModels() { + val objectMapper = jacksonMapperBuilder().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).build() + val resourceModels = snippetsDirectoryFile .walkTopDown()