diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationInvoker.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationInvoker.java index 199791e6a92a9170beb4a2f3957600668aa9dc4f..8901ba1945cfcc3697e327c3380c5db84ccc5e7d 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationInvoker.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationInvoker.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -21,8 +21,8 @@ package org.springframework.cache.interceptor; * *

Does not provide a way to transmit checked exceptions but * provide a special exception that should be used to wrap any - * exception that was thrown by the underlying invocation. Callers - * are expected to handle this issue type specifically. + * exception that was thrown by the underlying invocation. + * Callers are expected to handle this issue type specifically. * * @author Stephane Nicoll * @since 4.1 @@ -38,11 +38,12 @@ public interface CacheOperationInvoker { */ Object invoke() throws ThrowableWrapper; + /** - * Wrap any exception thrown while invoking {@link #invoke()} + * Wrap any exception thrown while invoking {@link #invoke()}. */ @SuppressWarnings("serial") - public static class ThrowableWrapper extends RuntimeException { + class ThrowableWrapper extends RuntimeException { private final Throwable original; @@ -52,7 +53,7 @@ public interface CacheOperationInvoker { } public Throwable getOriginal() { - return original; + return this.original; } } diff --git a/spring-context/src/test/java/org/springframework/cache/CacheReproTests.java b/spring-context/src/test/java/org/springframework/cache/CacheReproTests.java index 84d6bc7696a6f1d95231ff0091162525fee129df..8781e82a4b051f0fd89b01ecfb54c71230eb1edf 100644 --- a/spring-context/src/test/java/org/springframework/cache/CacheReproTests.java +++ b/spring-context/src/test/java/org/springframework/cache/CacheReproTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -83,11 +83,11 @@ public class CacheReproTests { String key = "1"; Object result = bean.getSimple("1"); - verify(cache, times(1)).get(key); // first call: cache miss + verify(cache, times(1)).get(key); // first call: cache miss Object cachedResult = bean.getSimple("1"); assertSame(result, cachedResult); - verify(cache, times(2)).get(key); // second call: cache hit + verify(cache, times(2)).get(key); // second call: cache hit context.close(); } @@ -100,11 +100,11 @@ public class CacheReproTests { String key = "1"; Object result = bean.getNeverCache("1"); - verify(cache, times(0)).get(key); // no cache hit at all, caching disabled + verify(cache, times(0)).get(key); // no cache hit at all, caching disabled Object cachedResult = bean.getNeverCache("1"); assertNotSame(result, cachedResult); - verify(cache, times(0)).get(key); // caching disabled + verify(cache, times(0)).get(key); // caching disabled context.close(); } @@ -114,8 +114,9 @@ public class CacheReproTests { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spr13081Config.class); MyCacheResolver cacheResolver = context.getBean(MyCacheResolver.class); Spr13081Service bean = context.getBean(Spr13081Service.class); + assertNull(cacheResolver.getCache("foo").get("foo")); - Object result = bean.getSimple("foo"); // cache name = id + Object result = bean.getSimple("foo"); // cache name = id assertEquals(result, cacheResolver.getCache("foo").get("foo").get()); } @@ -124,7 +125,6 @@ public class CacheReproTests { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spr13081Config.class); Spr13081Service bean = context.getBean(Spr13081Service.class); - thrown.expect(IllegalStateException.class); thrown.expectMessage(MyCacheResolver.class.getName()); bean.getSimple(null); @@ -245,6 +245,7 @@ public class CacheReproTests { } } + @Configuration @EnableCaching public static class Spr13081Config extends CachingConfigurerSupport { @@ -259,9 +260,9 @@ public class CacheReproTests { public Spr13081Service service() { return new Spr13081Service(); } - } + public static class MyCacheResolver extends AbstractCacheResolver { public MyCacheResolver() { @@ -282,6 +283,7 @@ public class CacheReproTests { } } + public static class Spr13081Service { @Cacheable diff --git a/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java b/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java index acd36a21511ce78e126d15397625150b980c85f7..301ad5a71a626d557ed82df1b85fe1d6c4443c26 100644 --- a/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -265,7 +265,8 @@ public abstract class ReflectionUtils { * checked exception is expected to be thrown by the target method. *

Throws the underlying RuntimeException or Error in case of an * InvocationTargetException with such a root cause. Throws an - * IllegalStateException with an appropriate message else. + * IllegalStateException with an appropriate message or + * UndeclaredThrowableException otherwise. * @param ex the reflection exception to handle */ public static void handleReflectionException(Exception ex) { @@ -288,7 +289,7 @@ public abstract class ReflectionUtils { * Handle the given invocation target exception. Should only be called if no * checked exception is expected to be thrown by the target method. *

Throws the underlying RuntimeException or Error in case of such a root - * cause. Throws an IllegalStateException else. + * cause. Throws an UndeclaredThrowableException otherwise. * @param ex the invocation target exception to handle */ public static void handleInvocationTargetException(InvocationTargetException ex) { @@ -300,8 +301,9 @@ public abstract class ReflectionUtils { * target exception of an {@link InvocationTargetException}. * Should only be called if no checked exception is expected to be thrown * by the target method. - *

Rethrows the underlying exception cast to an {@link RuntimeException} or - * {@link Error} if appropriate; otherwise, throws an {@link IllegalStateException}. + *

Rethrows the underlying exception cast to a {@link RuntimeException} or + * {@link Error} if appropriate; otherwise, throws an + * {@link UndeclaredThrowableException}. * @param ex the exception to rethrow * @throws RuntimeException the rethrown exception */ @@ -321,7 +323,8 @@ public abstract class ReflectionUtils { * Should only be called if no checked exception is expected to be thrown * by the target method. *

Rethrows the underlying exception cast to an {@link Exception} or - * {@link Error} if appropriate; otherwise, throws an {@link IllegalStateException}. + * {@link Error} if appropriate; otherwise, throws an + * {@link UndeclaredThrowableException}. * @param ex the exception to rethrow * @throws Exception the rethrown exception (in case of a checked exception) */ @@ -804,7 +807,7 @@ public abstract class ReflectionUtils { /** * Pre-built FieldFilter that matches all non-static, non-final fields. */ - public static FieldFilter COPYABLE_FIELDS = new FieldFilter() { + public static final FieldFilter COPYABLE_FIELDS = new FieldFilter() { @Override public boolean matches(Field field) { @@ -816,7 +819,7 @@ public abstract class ReflectionUtils { /** * Pre-built MethodFilter that matches all non-bridge methods. */ - public static MethodFilter NON_BRIDGED_METHODS = new MethodFilter() { + public static final MethodFilter NON_BRIDGED_METHODS = new MethodFilter() { @Override public boolean matches(Method method) { @@ -829,7 +832,7 @@ public abstract class ReflectionUtils { * Pre-built MethodFilter that matches all non-bridge methods * which are not declared on {@code java.lang.Object}. */ - public static MethodFilter USER_DECLARED_METHODS = new MethodFilter() { + public static final MethodFilter USER_DECLARED_METHODS = new MethodFilter() { @Override public boolean matches(Method method) {