Browse Source

Check for instanceof Throwable in AnnotationAttributes#assertNotException

Prior to this commit, AnnotationAttributes#assertNotException checked if
the attribute value was an instance of Exception. Although this was
typically sufficient, the scope was not always broad enough -- for
example, if AnnotationReadingVisitorUtils#convertClassValues stored a
Throwable in the map (such as a LinkageError).

This commit fixes this by checking for an instance of Throwable in
AnnotationAttributes#assertNotException.

Closes gh-23424
pull/23837/head
Sam Brannen 5 years ago
parent
commit
a092dc055e
  1. 4
      spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributes.java
  2. 10
      spring-core/src/test/java/org/springframework/core/annotation/AnnotationAttributesTests.java

4
spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributes.java

@ -353,10 +353,10 @@ public class AnnotationAttributes extends LinkedHashMap<String, Object> { @@ -353,10 +353,10 @@ public class AnnotationAttributes extends LinkedHashMap<String, Object> {
}
private void assertNotException(String attributeName, Object attributeValue) {
if (attributeValue instanceof Exception) {
if (attributeValue instanceof Throwable) {
throw new IllegalArgumentException(String.format(
"Attribute '%s' for annotation [%s] was not resolvable due to exception [%s]",
attributeName, this.displayName, attributeValue), (Exception) attributeValue);
attributeName, this.displayName, attributeValue), (Throwable) attributeValue);
}
}

10
spring-core/src/test/java/org/springframework/core/annotation/AnnotationAttributesTests.java

@ -77,13 +77,21 @@ public class AnnotationAttributesTests { @@ -77,13 +77,21 @@ public class AnnotationAttributesTests {
}
@Test
public void unresolvableClass() throws Exception {
public void unresolvableClassWithClassNotFoundException() throws Exception {
attributes.put("unresolvableClass", new ClassNotFoundException("myclass"));
exception.expect(IllegalArgumentException.class);
exception.expectMessage(containsString("myclass"));
attributes.getClass("unresolvableClass");
}
@Test
public void unresolvableClassWithLinkageError() throws Exception {
attributes.put("unresolvableClass", new LinkageError("myclass"));
exception.expect(IllegalArgumentException.class);
exception.expectMessage(containsString("myclass"));
attributes.getClass("unresolvableClass");
}
@Test
public void singleElementToSingleElementArrayConversionSupport() throws Exception {
Filter filter = FilteredClass.class.getAnnotation(Filter.class);

Loading…
Cancel
Save