From 4adc820714bc363b909a2107e57069aadb21f757 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 8 Jan 2018 13:41:23 +0100 Subject: [PATCH] Warning instead of error for non-present type filter class Issue: SPR-16356 --- .../parsing/CustomProblemReporterTests.java | 7 +-- .../ComponentScanBeanDefinitionParser.java | 56 +++++++++---------- .../config/JmsListenerContainerParser.java | 4 +- 3 files changed, 32 insertions(+), 35 deletions(-) diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/parsing/CustomProblemReporterTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/parsing/CustomProblemReporterTests.java index d2eae53b836..adfe6176cb1 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/parsing/CustomProblemReporterTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/parsing/CustomProblemReporterTests.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. @@ -66,10 +66,9 @@ public class CustomProblemReporterTests { private static class CollatingProblemReporter implements ProblemReporter { - private List errors = new ArrayList<>(); - - private List warnings = new ArrayList<>(); + private final List errors = new ArrayList<>(); + private final List warnings = new ArrayList<>(); @Override public void fatal(Problem problem) { diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanBeanDefinitionParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanBeanDefinitionParser.java index 6b5958eeb8f..680dfc18ef5 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanBeanDefinitionParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanBeanDefinitionParser.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. @@ -25,7 +25,6 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.springframework.beans.BeanUtils; -import org.springframework.beans.FatalBeanException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.parsing.BeanComponentDefinition; @@ -216,6 +215,10 @@ public class ComponentScanBeanDefinitionParser implements BeanDefinitionParser { scanner.addExcludeFilter(typeFilter); } } + catch (ClassNotFoundException ex) { + parserContext.getReaderContext().warning( + "Ignoring non-present type filter class: " + ex, parserContext.extractSource(element)); + } catch (Exception ex) { parserContext.getReaderContext().error( ex.getMessage(), parserContext.extractSource(element), ex.getCause()); @@ -225,39 +228,34 @@ public class ComponentScanBeanDefinitionParser implements BeanDefinitionParser { } @SuppressWarnings("unchecked") - protected TypeFilter createTypeFilter( - Element element, @Nullable ClassLoader classLoader, ParserContext parserContext) { + protected TypeFilter createTypeFilter(Element element, @Nullable ClassLoader classLoader, + ParserContext parserContext) throws ClassNotFoundException { String filterType = element.getAttribute(FILTER_TYPE_ATTRIBUTE); String expression = element.getAttribute(FILTER_EXPRESSION_ATTRIBUTE); expression = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(expression); - try { - if ("annotation".equals(filterType)) { - return new AnnotationTypeFilter((Class) ClassUtils.forName(expression, classLoader)); - } - else if ("assignable".equals(filterType)) { - return new AssignableTypeFilter(ClassUtils.forName(expression, classLoader)); - } - else if ("aspectj".equals(filterType)) { - return new AspectJTypeFilter(expression, classLoader); - } - else if ("regex".equals(filterType)) { - return new RegexPatternTypeFilter(Pattern.compile(expression)); - } - else if ("custom".equals(filterType)) { - Class filterClass = ClassUtils.forName(expression, classLoader); - if (!TypeFilter.class.isAssignableFrom(filterClass)) { - throw new IllegalArgumentException( - "Class is not assignable to [" + TypeFilter.class.getName() + "]: " + expression); - } - return (TypeFilter) BeanUtils.instantiateClass(filterClass); - } - else { - throw new IllegalArgumentException("Unsupported filter type: " + filterType); + if ("annotation".equals(filterType)) { + return new AnnotationTypeFilter((Class) ClassUtils.forName(expression, classLoader)); + } + else if ("assignable".equals(filterType)) { + return new AssignableTypeFilter(ClassUtils.forName(expression, classLoader)); + } + else if ("aspectj".equals(filterType)) { + return new AspectJTypeFilter(expression, classLoader); + } + else if ("regex".equals(filterType)) { + return new RegexPatternTypeFilter(Pattern.compile(expression)); + } + else if ("custom".equals(filterType)) { + Class filterClass = ClassUtils.forName(expression, classLoader); + if (!TypeFilter.class.isAssignableFrom(filterClass)) { + throw new IllegalArgumentException( + "Class is not assignable to [" + TypeFilter.class.getName() + "]: " + expression); } + return (TypeFilter) BeanUtils.instantiateClass(filterClass); } - catch (ClassNotFoundException ex) { - throw new FatalBeanException("Type filter class not found: " + expression, ex); + else { + throw new IllegalArgumentException("Unsupported filter type: " + filterType); } } diff --git a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java index 0e91e2ef363..f8043410129 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 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. @@ -150,7 +150,7 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser { if (!("auto".equals(cache) || "consumer".equals(cache))) { parserContext.getReaderContext().warning( "'cache' attribute not actively supported for listener container of type \"simple\". " + - "Effective runtime behavior will be equivalent to \"consumer\" / \"auto\".", containerEle); + "Effective runtime behavior will be equivalent to \"consumer\" / \"auto\".", containerEle); } } else {