From 1332482c406d7ae1876ea49bfb92e7b0a71538f7 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 4 May 2017 14:09:15 +0200 Subject: [PATCH] Polishing --- .../beans/factory/parsing/Problem.java | 12 ++--- .../factory/support/AbstractBeanFactory.java | 4 +- .../core/io/ResourceEditor.java | 6 ++- .../core/annotation/AnnotationUtilsTests.java | 45 ++++++++++--------- .../converter/FormHttpMessageConverter.java | 5 +-- .../web/servlet/DispatcherServlet.java | 10 +++-- 6 files changed, 46 insertions(+), 36 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java index 9f78a2909d4..c317d5f9358 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2017 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,7 +42,7 @@ public class Problem { /** * Create a new instance of the {@link Problem} class. - * @param message a message detailing the problem + * @param message a message detailing the problem * @param location the location within a bean configuration source that triggered the error */ public Problem(String message, Location location) { @@ -51,7 +51,7 @@ public class Problem { /** * Create a new instance of the {@link Problem} class. - * @param message a message detailing the problem + * @param message a message detailing the problem * @param parseState the {@link ParseState} at the time of the error * @param location the location within a bean configuration source that triggered the error */ @@ -61,8 +61,8 @@ public class Problem { /** * Create a new instance of the {@link Problem} class. - * @param message a message detailing the problem - * @param rootCause the underlying expection that caused the error (may be {@code null}) + * @param message a message detailing the problem + * @param rootCause the underlying exception that caused the error (may be {@code null}) * @param parseState the {@link ParseState} at the time of the error * @param location the location within a bean configuration source that triggered the error */ @@ -107,7 +107,7 @@ public class Problem { } /** - * Get the underlying expection that caused the error (may be {@code null}). + * Get the underlying exception that caused the error (may be {@code null}). */ public Throwable getRootCause() { return this.rootCause; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 324deb7ac5c..4c93eae615e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -1295,8 +1295,8 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp mbd.setScope(containingBd.getScope()); } - // Only cache the merged bean definition if we're already about to create an - // instance of the bean, or at least have already created an instance before. + // Cache the merged bean definition for the time being + // (it might still get re-merged later on in order to pick up metadata changes) if (containingBd == null && isCacheBeanMetadata()) { this.mergedBeanDefinitions.put(beanName, mbd); } diff --git a/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java b/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java index 7f8036a384d..d963b976f94 100644 --- a/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java +++ b/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2017 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. @@ -81,7 +81,9 @@ public class ResourceEditor extends PropertyEditorSupport { * @param ignoreUnresolvablePlaceholders whether to ignore unresolvable placeholders * if no corresponding property could be found in the given {@code propertyResolver} */ - public ResourceEditor(ResourceLoader resourceLoader, PropertyResolver propertyResolver, boolean ignoreUnresolvablePlaceholders) { + public ResourceEditor(ResourceLoader resourceLoader, PropertyResolver propertyResolver, + boolean ignoreUnresolvablePlaceholders) { + Assert.notNull(resourceLoader, "ResourceLoader must not be null"); this.resourceLoader = resourceLoader; this.propertyResolver = propertyResolver; diff --git a/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java b/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java index 632e9f43ce9..ca033bb1ba6 100644 --- a/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java @@ -54,6 +54,7 @@ import static org.springframework.core.annotation.AnnotationUtils.*; * @author Sam Brannen * @author Chris Beams * @author Phillip Webb + * @author Oleg Zhurakousky */ public class AnnotationUtilsTests { @@ -90,7 +91,7 @@ public class AnnotationUtilsTests { assertNotNull(findAnnotation(m, Order.class)); } - /** @since 4.2 */ + // @since 4.2 @Test public void findMethodAnnotationWithAnnotationOnMethodInInterface() throws Exception { Method m = Leaf.class.getMethod("fromInterfaceImplementedByRoot"); @@ -102,7 +103,7 @@ public class AnnotationUtilsTests { assertNotNull(findAnnotation(m, Order.class)); } - /** @since 4.2 */ + // @since 4.2 @Test public void findMethodAnnotationWithMetaAnnotationOnLeaf() throws Exception { Method m = Leaf.class.getMethod("metaAnnotatedOnLeaf"); @@ -111,7 +112,7 @@ public class AnnotationUtilsTests { assertNotNull(findAnnotation(m, Order.class)); } - /** @since 4.2 */ + // @since 4.2 @Test public void findMethodAnnotationWithMetaMetaAnnotationOnLeaf() throws Exception { Method m = Leaf.class.getMethod("metaMetaAnnotatedOnLeaf"); @@ -128,7 +129,7 @@ public class AnnotationUtilsTests { assertNotNull(findAnnotation(m, Order.class)); } - /** @since 4.2 */ + // @since 4.2 @Test public void findMethodAnnotationWithMetaAnnotationOnRoot() throws Exception { Method m = Leaf.class.getMethod("metaAnnotatedOnRoot"); @@ -258,42 +259,42 @@ public class AnnotationUtilsTests { assertNull("Should not find @Component on MetaCycleAnnotatedClass", component); } - /** @since 4.2 */ + // @since 4.2 @Test public void findClassAnnotationOnInheritedAnnotationInterface() { Transactional tx = findAnnotation(InheritedAnnotationInterface.class, Transactional.class); assertNotNull("Should find @Transactional on InheritedAnnotationInterface", tx); } - /** @since 4.2 */ + // @since 4.2 @Test public void findClassAnnotationOnSubInheritedAnnotationInterface() { Transactional tx = findAnnotation(SubInheritedAnnotationInterface.class, Transactional.class); assertNotNull("Should find @Transactional on SubInheritedAnnotationInterface", tx); } - /** @since 4.2 */ + // @since 4.2 @Test public void findClassAnnotationOnSubSubInheritedAnnotationInterface() { Transactional tx = findAnnotation(SubSubInheritedAnnotationInterface.class, Transactional.class); assertNotNull("Should find @Transactional on SubSubInheritedAnnotationInterface", tx); } - /** @since 4.2 */ + // @since 4.2 @Test public void findClassAnnotationOnNonInheritedAnnotationInterface() { Order order = findAnnotation(NonInheritedAnnotationInterface.class, Order.class); assertNotNull("Should find @Order on NonInheritedAnnotationInterface", order); } - /** @since 4.2 */ + // @since 4.2 @Test public void findClassAnnotationOnSubNonInheritedAnnotationInterface() { Order order = findAnnotation(SubNonInheritedAnnotationInterface.class, Order.class); assertNotNull("Should find @Order on SubNonInheritedAnnotationInterface", order); } - /** @since 4.2 */ + // @since 4.2 @Test public void findClassAnnotationOnSubSubNonInheritedAnnotationInterface() { Order order = findAnnotation(SubSubNonInheritedAnnotationInterface.class, Order.class); @@ -1240,6 +1241,11 @@ public class AnnotationUtilsTests { assertEquals("location: ", "", contextConfig.location()); } + @Test(expected = AnnotationConfigurationException.class) + public void synthesizeAnnotationWithAttributeAliasesDifferentValues() throws Exception { + getValue(synthesizeAnnotation(ContextConfigMismatch.class.getAnnotation(ContextConfig.class))); + } + @Test public void synthesizeAnnotationFromMapWithMinimalAttributesWithAttributeAliases() throws Exception { Map map = Collections.singletonMap("location", "test.xml"); @@ -1357,11 +1363,6 @@ public class AnnotationUtilsTests { assertNotNull(synthesizedWebMapping2); assertThat(webMappingWithAliases.toString(), is(not(synthesizedWebMapping1.toString()))); - - // The unsynthesized annotation for handleMappedWithSamePathAndValueAttributes() - // should produce the same toString() results as synthesized annotations for - // handleMappedWithPathAttribute() - assertToStringForWebMappingWithPathAndValue(webMappingWithPathAndValue); assertToStringForWebMappingWithPathAndValue(synthesizedWebMapping1); assertToStringForWebMappingWithPathAndValue(synthesizedWebMapping2); } @@ -1819,13 +1820,13 @@ public class AnnotationUtilsTests { interface InterfaceWithRepeated { @MyRepeatable("A") - @MyRepeatableContainer({ @MyRepeatable("B"), @MyRepeatable("C") }) + @MyRepeatableContainer({@MyRepeatable("B"), @MyRepeatable("C")}) @MyRepeatableMeta1 void foo(); } @MyRepeatable("A") - @MyRepeatableContainer({ @MyRepeatable("B"), @MyRepeatable("C") }) + @MyRepeatableContainer({@MyRepeatable("B"), @MyRepeatable("C")}) @MyRepeatableMeta1 static class MyRepeatableClass { } @@ -1834,7 +1835,7 @@ public class AnnotationUtilsTests { } @MyRepeatable("X") - @MyRepeatableContainer({ @MyRepeatable("Y"), @MyRepeatable("Z") }) + @MyRepeatableContainer({@MyRepeatable("Y"), @MyRepeatable("Z")}) @MyRepeatableMeta2 static class SubMyRepeatableWithAdditionalLocalDeclarationsClass extends MyRepeatableClass { } @@ -1964,7 +1965,7 @@ public class AnnotationUtilsTests { BrokenContextConfig[] value(); } - @Hierarchy({ @ContextConfig("A"), @ContextConfig(location = "B") }) + @Hierarchy({@ContextConfig("A"), @ContextConfig(location = "B")}) static class ConfigHierarchyTestCase { } @@ -2316,7 +2317,7 @@ public class AnnotationUtilsTests { Filter[] excludeFilters() default {}; } - @ComponentScan(excludeFilters = { @Filter(pattern = "*Foo"), @Filter(pattern = "*Bar") }) + @ComponentScan(excludeFilters = {@Filter(pattern = "*Foo"), @Filter(pattern = "*Bar")}) static class ComponentScanClass { } @@ -2344,4 +2345,8 @@ public class AnnotationUtilsTests { String text(); } + @ContextConfig(value = "foo", location = "bar") + interface ContextConfigMismatch { + } + } diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index e7776f0751b..51a3538af4f 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -179,12 +179,11 @@ public class FormHttpMessageConverter implements HttpMessageConverterIf not set file names will be encoded as US-ASCII. - * @param multipartCharset the charset to use * @since 4.1.1 * @see Encoded-Word */ - public void setMultipartCharset(Charset multipartCharset) { - this.multipartCharset = multipartCharset; + public void setMultipartCharset(Charset charset) { + this.multipartCharset = charset; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java index b365cd61c76..da047ed0b5a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java @@ -264,6 +264,10 @@ public class DispatcherServlet extends FrameworkServlet { */ private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties"; + /** + * Common prefix that DispatcherServlet's default strategy attributes start with. + */ + private static final String DEFAULT_STRATEGIES_PREFIX = "org.springframework.web.servlet"; /** Additional logger to use when no mapped handler is found for a request. */ protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY); @@ -279,7 +283,7 @@ public class DispatcherServlet extends FrameworkServlet { defaultStrategies = PropertiesLoaderUtils.loadProperties(resource); } catch (IOException ex) { - throw new IllegalStateException("Could not load 'DispatcherServlet.properties': " + ex.getMessage()); + throw new IllegalStateException("Could not load '" + DEFAULT_STRATEGIES_PATH + "': " + ex.getMessage()); } } @@ -874,7 +878,7 @@ public class DispatcherServlet extends FrameworkServlet { Enumeration attrNames = request.getAttributeNames(); while (attrNames.hasMoreElements()) { String attrName = (String) attrNames.nextElement(); - if (this.cleanupAfterInclude || attrName.startsWith("org.springframework.web.servlet")) { + if (this.cleanupAfterInclude || attrName.startsWith(DEFAULT_STRATEGIES_PREFIX)) { attributesSnapshot.put(attrName, request.getAttribute(attrName)); } } @@ -1348,7 +1352,7 @@ public class DispatcherServlet extends FrameworkServlet { Enumeration attrNames = request.getAttributeNames(); while (attrNames.hasMoreElements()) { String attrName = (String) attrNames.nextElement(); - if (this.cleanupAfterInclude || attrName.startsWith("org.springframework.web.servlet")) { + if (this.cleanupAfterInclude || attrName.startsWith(DEFAULT_STRATEGIES_PREFIX)) { attrsToCheck.add(attrName); } }