Restore proper use of CacheLoader
Since Guava 11, CacheLoader is only invoked with a LoadingCache but the GuavaCache wrapper is always invoking getIfPresent(), available on the main Guava Cache interface. Update GuavaCache#get to check for the presence of a LoadingCache and call the appropriate method. Issue: SPR-12842
This commit is contained in:
parent
7513bd5757
commit
9172a6d05e
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2014 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -20,6 +20,9 @@ import java.io.Serializable;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
|
import com.google.common.cache.LoadingCache;
|
||||||
|
import com.google.common.util.concurrent.UncheckedExecutionException;
|
||||||
|
|
||||||
import org.springframework.cache.Cache;
|
import org.springframework.cache.Cache;
|
||||||
import org.springframework.cache.support.SimpleValueWrapper;
|
import org.springframework.cache.support.SimpleValueWrapper;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
@ -88,8 +91,16 @@ public class GuavaCache implements Cache {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ValueWrapper get(Object key) {
|
public ValueWrapper get(Object key) {
|
||||||
Object value = this.cache.getIfPresent(key);
|
if (this.cache instanceof LoadingCache) {
|
||||||
return toWrapper(value);
|
try {
|
||||||
|
Object value = ((LoadingCache<Object, Object>) this.cache).get(key);
|
||||||
|
return toWrapper(value);
|
||||||
|
}
|
||||||
|
catch (ExecutionException ex) {
|
||||||
|
throw new UncheckedExecutionException(ex.getMessage(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return toWrapper(this.cache.getIfPresent(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2014 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -18,7 +18,10 @@ package org.springframework.cache.guava;
|
||||||
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
|
import com.google.common.util.concurrent.UncheckedExecutionException;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
import org.springframework.cache.Cache;
|
import org.springframework.cache.Cache;
|
||||||
import org.springframework.cache.CacheManager;
|
import org.springframework.cache.CacheManager;
|
||||||
|
@ -32,6 +35,9 @@ import static org.mockito.Mockito.*;
|
||||||
*/
|
*/
|
||||||
public class GuavaCacheManagerTests {
|
public class GuavaCacheManagerTests {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public final ExpectedException thrown = ExpectedException.none();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDynamicMode() {
|
public void testDynamicMode() {
|
||||||
CacheManager cm = new GuavaCacheManager();
|
CacheManager cm = new GuavaCacheManager();
|
||||||
|
@ -150,6 +156,28 @@ public class GuavaCacheManagerTests {
|
||||||
assertNotNull(cm.getCache("someCache"));
|
assertNotNull(cm.getCache("someCache"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void cacheLoaderUseLoadingCache() {
|
||||||
|
GuavaCacheManager cm = new GuavaCacheManager("c1");
|
||||||
|
cm.setCacheLoader(new CacheLoader<Object, Object>() {
|
||||||
|
@Override
|
||||||
|
public Object load(Object key) throws Exception {
|
||||||
|
if ("ping".equals(key)) {
|
||||||
|
return "pong";
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("I only know ping");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Cache cache1 = cm.getCache("c1");
|
||||||
|
Cache.ValueWrapper value = cache1.get("ping");
|
||||||
|
assertNotNull(value);
|
||||||
|
assertEquals("pong", value.get());
|
||||||
|
|
||||||
|
thrown.expect(UncheckedExecutionException.class);
|
||||||
|
thrown.expectMessage("I only know ping");
|
||||||
|
assertNull(cache1.get("foo"));
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private CacheLoader<Object, Object> mockCacheLoader() {
|
private CacheLoader<Object, Object> mockCacheLoader() {
|
||||||
return mock(CacheLoader.class);
|
return mock(CacheLoader.class);
|
||||||
|
|
Loading…
Reference in New Issue