diff --git a/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCache.java b/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCache.java index fa673b8742..7302b9de78 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCache.java +++ b/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -100,6 +100,7 @@ public class CaffeineCache extends AbstractValueAdaptingCache { } @Override + @Nullable protected Object lookup(Object key) { return this.cache.getIfPresent(key); } diff --git a/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java b/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java index 38b3bd193b..743592643f 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java +++ b/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,13 +42,15 @@ public class EhCacheCache implements Cache { /** * Create an {@link EhCacheCache} instance. - * @param ehcache backing Ehcache instance + * @param ehcache the backing Ehcache instance */ public EhCacheCache(Ehcache ehcache) { Assert.notNull(ehcache, "Ehcache must not be null"); Status status = ehcache.getStatus(); - Assert.isTrue(Status.STATUS_ALIVE.equals(status), - "An 'alive' Ehcache is required - current cache is " + status.toString()); + if (!Status.STATUS_ALIVE.equals(status)) { + throw new IllegalArgumentException( + "An 'alive' Ehcache is required - current cache is " + status.toString()); + } this.cache = ehcache; } @@ -81,7 +83,7 @@ public class EhCacheCache implements Cache { else { this.cache.acquireWriteLockOnKey(key); try { - element = lookup(key); // One more attempt with the write lock + element = lookup(key); // one more attempt with the write lock if (element != null) { return (T) element.getObjectValue(); } @@ -115,7 +117,8 @@ public class EhCacheCache implements Cache { Element element = this.cache.get(key); Object value = (element != null ? element.getObjectValue() : null); if (value != null && type != null && !type.isInstance(value)) { - throw new IllegalStateException("Cached value is not of required type [" + type.getName() + "]: " + value); + throw new IllegalStateException( + "Cached value is not of required type [" + type.getName() + "]: " + value); } return (T) value; } diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java index 54be6d678f..ed6f8cbaa0 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,6 +71,7 @@ public class JCacheCache extends AbstractValueAdaptingCache { } @Override + @Nullable protected Object lookup(Object key) { return this.cache.get(key); } diff --git a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java index 361ed2b662..852caac56f 100644 --- a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java +++ b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -132,6 +132,7 @@ public class ConcurrentMapCache extends AbstractValueAdaptingCache { } @Override + @Nullable protected Object lookup(Object key) { return this.store.get(key); } @@ -201,8 +202,8 @@ public class ConcurrentMapCache extends AbstractValueAdaptingCache { } @Override - protected Object fromStoreValue(Object storeValue) { - if (this.serialization != null) { + protected Object fromStoreValue(@Nullable Object storeValue) { + if (storeValue != null && this.serialization != null) { try { return super.fromStoreValue(deserializeValue(this.serialization, storeValue)); } diff --git a/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java b/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java index 72e8ecd1e6..77a16924b3 100644 --- a/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java +++ b/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,7 +65,8 @@ public abstract class AbstractValueAdaptingCache implements Cache { public T get(Object key, @Nullable Class type) { Object value = fromStoreValue(lookup(key)); if (value != null && type != null && !type.isInstance(value)) { - throw new IllegalStateException("Cached value is not of required type [" + type.getName() + "]: " + value); + throw new IllegalStateException( + "Cached value is not of required type [" + type.getName() + "]: " + value); } return (T) value; } @@ -73,8 +74,9 @@ public abstract class AbstractValueAdaptingCache implements Cache { /** * Perform an actual lookup in the underlying store. * @param key the key whose associated value is to be returned - * @return the raw store value for the key + * @return the raw store value for the key, or {@code null} if none */ + @Nullable protected abstract Object lookup(Object key); @@ -85,7 +87,7 @@ public abstract class AbstractValueAdaptingCache implements Cache { * @return the value to return to the user */ @Nullable - protected Object fromStoreValue(Object storeValue) { + protected Object fromStoreValue(@Nullable Object storeValue) { if (this.allowNullValues && storeValue == NullValue.INSTANCE) { return null; } @@ -104,8 +106,7 @@ public abstract class AbstractValueAdaptingCache implements Cache { return NullValue.INSTANCE; } throw new IllegalArgumentException( - String.format("Cache '%s' is configured to not allow null " + - "values but null was provided", getName())); + "Cache '" + getName() + "' is configured to not allow null values but null was provided"); } return userValue; }