Skip to content

Commit d980f91

Browse files
committed
Jackson - Reset the TypeFactory type cache when shutting down
This will cause class loader leaks in test and dev mode, otherwise. Fixes quarkusio#51688
1 parent 39b9c8d commit d980f91

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

extensions/jackson/deployment/src/main/java/io/quarkus/jackson/deployment/JacksonProcessor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import io.quarkus.deployment.annotations.ExecutionTime;
5757
import io.quarkus.deployment.annotations.Record;
5858
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
59+
import io.quarkus.deployment.builditem.ShutdownListenerBuildItem;
5960
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
6061
import io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyBuildItem;
6162
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
@@ -531,6 +532,12 @@ public SyntheticBeanBuildItem jacksonSupport(JacksonRecorder recorder,
531532
.done();
532533
}
533534

535+
@Record(ExecutionTime.RUNTIME_INIT)
536+
@BuildStep
537+
public ShutdownListenerBuildItem clearCachesOnShutdown(JacksonRecorder recorder) {
538+
return new ShutdownListenerBuildItem(recorder.clearCachesOnShutdown());
539+
}
540+
534541
private Optional<String> determinePropertyNamingStrategyClassName(JacksonBuildTimeConfig jacksonBuildTimeConfig) {
535542
if (jacksonBuildTimeConfig.propertyNamingStrategy().isEmpty()) {
536543
return Optional.empty();

extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonRecorder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
import com.fasterxml.jackson.databind.ObjectMapper;
88
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
9+
import com.fasterxml.jackson.databind.type.TypeFactory;
910

1011
import io.quarkus.jackson.ObjectMapperCustomizer;
1112
import io.quarkus.runtime.annotations.Recorder;
13+
import io.quarkus.runtime.annotations.RuntimeInit;
1214
import io.quarkus.runtime.annotations.StaticInit;
15+
import io.quarkus.runtime.shutdown.ShutdownListener;
1316

1417
@Recorder
1518
public class JacksonRecorder {
@@ -63,4 +66,14 @@ public int priority() {
6366
}
6467
};
6568
}
69+
70+
@RuntimeInit
71+
public ShutdownListener clearCachesOnShutdown() {
72+
return new ShutdownListener() {
73+
@Override
74+
public void shutdown(ShutdownNotification notification) {
75+
TypeFactory.defaultInstance().clearCache();
76+
}
77+
};
78+
}
6679
}

0 commit comments

Comments
 (0)