public static synchronized void reset() { for (ObjectMapper mapper : U.list(MAPPER, PRETTY_MAPPER)) { SerializerProvider serializerProvider = mapper.getSerializerProvider(); if (serializerProvider instanceof DefaultSerializerProvider) { DefaultSerializerProvider provider = (DefaultSerializerProvider) serializerProvider; provider.flushCachedSerializers(); } else { Log.warn("Couldn't clear the cache of Jackson serializers!", "class", Cls.of(serializerProvider)); } DeserializationContext deserializationContext = mapper.getDeserializationContext(); Object cache = Cls.getFieldValue(deserializationContext, "_cache"); if (cache instanceof DeserializerCache) { DeserializerCache deserializerCache = (DeserializerCache) cache; deserializerCache.flushCachedDeserializers(); } else { Log.warn("Couldn't clear the cache of Jackson deserializers!", "class", Cls.of(cache)); } } }
private void invalidateJacksonCaches() { try { ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory(); Collection<ObjectMapper> mappers = BeanFactoryUtils .beansOfTypeIncludingAncestors(beanFactory, ObjectMapper.class) .values(); for (ObjectMapper mapper : mappers) { log.trace("Flushing Jackson serializer cache"); SerializerProvider serializerProvider = mapper.getSerializerProvider(); Field serializerCacheField = serializerProvider.getClass().getSuperclass().getSuperclass().getDeclaredField("_serializerCache"); ReflectionUtils.makeAccessible(serializerCacheField); SerializerCache serializerCache = (SerializerCache) serializerCacheField.get(serializerProvider); Method serializerCacheFlushMethod = SerializerCache.class.getDeclaredMethod("flush"); serializerCacheFlushMethod.invoke(serializerCache); log.trace("Flushing Jackson deserializer cache"); DeserializationContext deserializationContext = mapper.getDeserializationContext(); Field deSerializerCacheField = deserializationContext.getClass().getSuperclass().getSuperclass().getDeclaredField("_cache"); ReflectionUtils.makeAccessible(deSerializerCacheField); DeserializerCache deSerializerCache = (DeserializerCache) deSerializerCacheField.get(deserializationContext); Method deSerializerCacheFlushMethod = DeserializerCache.class.getDeclaredMethod("flushCachedDeserializers"); deSerializerCacheFlushMethod.invoke(deSerializerCache); } } catch (Exception e) { log.warn("Could not hot reload Jackson class!"); e.printStackTrace(); } }
public void reloadEvent() { log.debug("Hot reloading Jackson classes"); try { ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory(); Collection<ObjectMapper> mappers = BeanFactoryUtils .beansOfTypeIncludingAncestors(beanFactory, ObjectMapper.class) .values(); for (ObjectMapper mapper : mappers) { log.trace("Flushing Jackson serializer cache"); SerializerProvider serializerProvider = mapper.getSerializerProvider(); Field serializerCacheField = serializerProvider.getClass().getSuperclass().getSuperclass().getDeclaredField("_serializerCache"); ReflectionUtils.makeAccessible(serializerCacheField); SerializerCache serializerCache = (SerializerCache) serializerCacheField.get(serializerProvider); Method serializerCacheFlushMethod = SerializerCache.class.getDeclaredMethod("flush"); serializerCacheFlushMethod.invoke(serializerCache); log.trace("Flushing Jackson deserializer cache"); DeserializationContext deserializationContext = mapper.getDeserializationContext(); Field deSerializerCacheField = deserializationContext.getClass().getSuperclass().getSuperclass().getDeclaredField("_cache"); ReflectionUtils.makeAccessible(deSerializerCacheField); DeserializerCache deSerializerCache = (DeserializerCache) deSerializerCacheField.get(deserializationContext); Method deSerializerCacheFlushMethod = DeserializerCache.class.getDeclaredMethod("flushCachedDeserializers"); deSerializerCacheFlushMethod.invoke(deSerializerCache); } } catch (Exception e) { log.warn("Could not hot reload Jackson class!"); e.printStackTrace(); } }