diff --git a/src/main/java/it/aboutbits/springboot/toolbox/jackson/CustomTypeDeserializer.java b/src/main/java/it/aboutbits/springboot/toolbox/jackson/CustomTypeDeserializer.java index c50e6e5..e4c75e6 100644 --- a/src/main/java/it/aboutbits/springboot/toolbox/jackson/CustomTypeDeserializer.java +++ b/src/main/java/it/aboutbits/springboot/toolbox/jackson/CustomTypeDeserializer.java @@ -44,6 +44,10 @@ public Class handledType() { @Override public T deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + if (jsonParser.getCurrentToken() == null) { + return null; + } + var value = typeConverter.apply(jsonParser); try { diff --git a/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java b/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java index 9bcd0fc..195feb7 100644 --- a/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java +++ b/src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java @@ -6,19 +6,27 @@ import org.jspecify.annotations.NullMarked; import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @NullMarked public final class ClassScannerUtil { + private static final Map CACHE = new ConcurrentHashMap<>(); + private ClassScannerUtil() { } public static ClassScanner getScannerForPackages(String... packages) { - return new ClassScanner(packages); + var cacheKey = Arrays.stream(packages) + .sorted() + .collect(Collectors.joining("|")); + return CACHE.computeIfAbsent(cacheKey, _ -> new ClassScanner(packages)); } - public static final class ClassScanner implements AutoCloseable { + public static final class ClassScanner { private final ScanResult scanResult; private final String[] packages; @@ -51,10 +59,5 @@ public Set> getClassesAnnotatedWith(Class clazz) ClassInfo::loadClass ).collect(Collectors.toSet()); } - - @Override - public void close() { - scanResult.close(); - } } }