From 601e352f8c4aae39cea287d853eab364c35f37bf Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 3 Apr 2019 17:14:12 +0200 Subject: [PATCH] Polishing --- .../AbstractNestablePropertyAccessor.java | 11 +- .../beans/factory/ListableBeanFactory.java | 18 +- .../support/AbstractBeanDefinition.java | 9 +- .../support/BeanDefinitionDefaults.java | 64 ++++++-- .../support/DefaultListableBeanFactory.java | 36 +--- .../xml/BeanDefinitionParserDelegate.java | 4 +- .../context/annotation/Configuration.java | 126 +++++++------- .../jdbc/support/KeyHolder.java | 4 +- .../BeanPropertySqlParameterSourceTests.java | 12 +- .../MapSqlParameterSourceTests.java | 8 +- .../oxm/jaxb/Jaxb2Marshaller.java | 155 +++++++++--------- .../org/springframework/http/HttpHeaders.java | 2 + .../web/cors/CorsConfiguration.java | 31 ++-- .../web/servlet/config/MvcNamespaceTests.java | 15 +- 14 files changed, 273 insertions(+), 222 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java index 88184836a5..3b4c769cee 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -194,7 +194,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA this.wrappedObject = ObjectUtils.unwrapOptional(object); Assert.notNull(this.wrappedObject, "Target object must not be null"); this.nestedPath = (nestedPath != null ? nestedPath : ""); - this.rootObject = (!"".equals(this.nestedPath) ? rootObject : this.wrappedObject); + this.rootObject = (!this.nestedPath.isEmpty() ? rootObject : this.wrappedObject); this.nestedPropertyAccessors = null; this.typeConverterDelegate = new TypeConverterDelegate(this, this.wrappedObject); } @@ -958,6 +958,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA return tokens; } + @Override public String toString() { StringBuilder sb = new StringBuilder(getClass().getName()); @@ -971,6 +972,9 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA } + /** + * A handler for a specific property. + */ protected abstract static class PropertyHandler { private final Class propertyType; @@ -1026,6 +1030,9 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA } + /** + * Holder class used to store property tokens. + */ protected static class PropertyTokenHolder { public PropertyTokenHolder(String name) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java index 62c6e2b10d..b0586b8be9 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -243,18 +243,19 @@ public interface ListableBeanFactory extends BeanFactory { throws BeansException; /** - * Find all names of beans whose {@code Class} has the supplied {@link Annotation} + * Find all names of beans which are annotated with the supplied {@link Annotation} * type, without creating corresponding bean instances yet. *

Note that this method considers objects created by FactoryBeans, which means * that FactoryBeans will get initialized in order to determine their object type. * @param annotationType the type of annotation to look for * @return the names of all matching beans * @since 4.0 + * @see #findAnnotationOnBean */ String[] getBeanNamesForAnnotation(Class annotationType); /** - * Find all beans whose {@code Class} has the supplied {@link Annotation} type, + * Find all beans which are annotated with the supplied {@link Annotation} type, * returning a Map of bean names with corresponding bean instances. *

Note that this method considers objects created by FactoryBeans, which means * that FactoryBeans will get initialized in order to determine their object type. @@ -263,18 +264,21 @@ public interface ListableBeanFactory extends BeanFactory { * keys and the corresponding bean instances as values * @throws BeansException if a bean could not be created * @since 3.0 + * @see #findAnnotationOnBean */ Map getBeansWithAnnotation(Class annotationType) throws BeansException; /** - * Find an {@link Annotation} of {@code annotationType} on the specified - * bean, traversing its interfaces and super classes if no annotation can be - * found on the given class itself. + * Find an {@link Annotation} of {@code annotationType} on the specified bean, + * traversing its interfaces and super classes if no annotation can be found on + * the given class itself. * @param beanName the name of the bean to look for annotations on - * @param annotationType the annotation class to look for + * @param annotationType the type of annotation to look for * @return the annotation of the given type if found, or {@code null} otherwise * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 3.0 + * @see #getBeanNamesForAnnotation + * @see #getBeansWithAnnotation */ @Nullable A findAnnotationOnBean(String beanName, Class annotationType) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java index a7c61bec7f..202b68f5bf 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java @@ -352,7 +352,8 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess /** * Apply the provided default values to this bean. - * @param defaults the defaults to apply + * @param defaults the default settings to apply + * @since 2.5 */ public void applyDefaults(BeanDefinitionDefaults defaults) { setLazyInit(defaults.isLazyInit()); @@ -515,6 +516,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess /** * Return whether this bean should be lazily initialized, i.e. not * eagerly instantiated on startup. Only applicable to a singleton bean. + * @return whether to apply lazy-init semantics ({@code false} by default) */ @Override public boolean isLazyInit() { @@ -523,8 +525,9 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess /** * Set the autowire mode. This determines whether any automagical detection - * and setting of bean references will happen. Default is AUTOWIRE_NO, - * which means there's no autowire. + * and setting of bean references will happen. Default is AUTOWIRE_NO + * which means there won't be convention-based autowiring by name or type + * (however, there may still be explicit annotation-driven autowiring). * @param autowireMode the autowire mode to set. * Must be one of the constants defined in this class. * @see #AUTOWIRE_NO diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionDefaults.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionDefaults.java index 2a3bd635f9..19bc13b72c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionDefaults.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionDefaults.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -23,16 +23,17 @@ import org.springframework.util.StringUtils; * A simple holder for {@code BeanDefinition} property defaults. * * @author Mark Fisher + * @author Juergen Hoeller * @since 2.5 */ public class BeanDefinitionDefaults { private boolean lazyInit; - private int dependencyCheck = AbstractBeanDefinition.DEPENDENCY_CHECK_NONE; - private int autowireMode = AbstractBeanDefinition.AUTOWIRE_NO; + private int dependencyCheck = AbstractBeanDefinition.DEPENDENCY_CHECK_NONE; + @Nullable private String initMethodName; @@ -40,43 +41,84 @@ public class BeanDefinitionDefaults { private String destroyMethodName; + /** + * Set whether beans should be lazily initialized by default. + *

If {@code false}, the bean will get instantiated on startup by bean + * factories that perform eager initialization of singletons. + */ public void setLazyInit(boolean lazyInit) { this.lazyInit = lazyInit; } + /** + * Return whether beans should be lazily initialized by default, i.e. not + * eagerly instantiated on startup. Only applicable to singleton beans. + * @return whether to apply lazy-init semantics ({@code false} by default) + */ public boolean isLazyInit() { return this.lazyInit; } - public void setDependencyCheck(int dependencyCheck) { - this.dependencyCheck = dependencyCheck; - } - - public int getDependencyCheck() { - return this.dependencyCheck; - } - + /** + * Set the autowire mode. This determines whether any automagical detection + * and setting of bean references will happen. Default is AUTOWIRE_NO + * which means there won't be convention-based autowiring by name or type + * (however, there may still be explicit annotation-driven autowiring). + * @param autowireMode the autowire mode to set. + * Must be one of the constants defined in {@link AbstractBeanDefinition}. + */ public void setAutowireMode(int autowireMode) { this.autowireMode = autowireMode; } + /** + * Return the default autowire mode. + */ public int getAutowireMode() { return this.autowireMode; } + /** + * Set the dependency check code. + * @param dependencyCheck the code to set. + * Must be one of the constants defined in {@link AbstractBeanDefinition}. + */ + public void setDependencyCheck(int dependencyCheck) { + this.dependencyCheck = dependencyCheck; + } + + /** + * Return the default dependency check code. + */ + public int getDependencyCheck() { + return this.dependencyCheck; + } + + /** + * Set the name of the default initializer method. + */ public void setInitMethodName(@Nullable String initMethodName) { this.initMethodName = (StringUtils.hasText(initMethodName) ? initMethodName : null); } + /** + * Return the name of the default initializer method. + */ @Nullable public String getInitMethodName() { return this.initMethodName; } + /** + * Set the name of the default destroy method. + */ public void setDestroyMethodName(@Nullable String destroyMethodName) { this.destroyMethodName = (StringUtils.hasText(destroyMethodName) ? destroyMethodName : null); } + /** + * Return the name of the default destroy method. + */ @Nullable public String getDestroyMethodName() { return this.destroyMethodName; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index ecea32806d..d72840054e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -563,12 +563,6 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto return result; } - /** - * Find a {@link Annotation} of {@code annotationType} on the specified - * bean, traversing its interfaces and super classes if no annotation can be - * found on the given class itself, as well as checking its raw bean class - * if not found on the exposed bean reference (e.g. in case of a proxy). - */ @Override @Nullable public A findAnnotationOnBean(String beanName, Class annotationType) @@ -580,14 +574,12 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto ann = AnnotationUtils.findAnnotation(beanType, annotationType); } if (ann == null && containsBeanDefinition(beanName)) { - BeanDefinition bd = getMergedBeanDefinition(beanName); - if (bd instanceof AbstractBeanDefinition) { - AbstractBeanDefinition abd = (AbstractBeanDefinition) bd; - if (abd.hasBeanClass()) { - Class beanClass = abd.getBeanClass(); - if (beanClass != beanType) { - ann = AnnotationUtils.findAnnotation(beanClass, annotationType); - } + // Check raw bean class, e.g. in case of a proxy. + RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); + if (bd.hasBeanClass()) { + Class beanClass = bd.getBeanClass(); + if (beanClass != beanType) { + ann = AnnotationUtils.findAnnotation(beanClass, annotationType); } } } @@ -1793,10 +1785,11 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @Override @Nullable public Object getOrderSource(Object obj) { - RootBeanDefinition beanDefinition = getRootBeanDefinition(this.instancesToBeanNames.get(obj)); - if (beanDefinition == null) { + String beanName = this.instancesToBeanNames.get(obj); + if (beanName == null || !containsBeanDefinition(beanName)) { return null; } + RootBeanDefinition beanDefinition = getMergedLocalBeanDefinition(beanName); List sources = new ArrayList<>(2); Method factoryMethod = beanDefinition.getResolvedFactoryMethod(); if (factoryMethod != null) { @@ -1808,17 +1801,6 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto } return sources.toArray(); } - - @Nullable - private RootBeanDefinition getRootBeanDefinition(@Nullable String beanName) { - if (beanName != null && containsBeanDefinition(beanName)) { - BeanDefinition bd = getMergedBeanDefinition(beanName); - if (bd instanceof RootBeanDefinition) { - return (RootBeanDefinition) bd; - } - } - return null; - } } } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java index 956cdc8d53..c24360bd3f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java @@ -312,7 +312,7 @@ public class BeanDefinitionParserDelegate { /** * Populate the given DocumentDefaultsDefinition instance with the default lazy-init, * autowire, dependency check settings, init-method, destroy-method and merge settings. - * Support nested 'beans' element use cases by falling back to parentDefaults + * Support nested 'beans' element use cases by falling back to {@code parentDefaults} * in case the defaults are not explicitly set locally. * @param defaults the defaults to populate * @param parentDefaults the parent BeanDefinitionParserDelegate (if any) defaults to fall back to @@ -377,7 +377,7 @@ public class BeanDefinitionParserDelegate { */ public BeanDefinitionDefaults getBeanDefinitionDefaults() { BeanDefinitionDefaults bdd = new BeanDefinitionDefaults(); - bdd.setLazyInit("TRUE".equalsIgnoreCase(this.defaults.getLazyInit())); + bdd.setLazyInit(TRUE_VALUE.equalsIgnoreCase(this.defaults.getLazyInit())); bdd.setAutowireMode(getAutowireMode(DEFAULT_VALUE)); bdd.setInitMethodName(this.defaults.getInitMethod()); bdd.setDestroyMethodName(this.defaults.getDestroyMethod()); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/Configuration.java b/spring-context/src/main/java/org/springframework/context/annotation/Configuration.java index 53ffc6f7a8..077c0ec3a6 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/Configuration.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/Configuration.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -46,7 +46,7 @@ import org.springframework.stereotype.Component; * *

Via {@code AnnotationConfigApplicationContext}

* - * {@code @Configuration} classes are typically bootstrapped using either + *

{@code @Configuration} classes are typically bootstrapped using either * {@link AnnotationConfigApplicationContext} or its web-capable variant, * {@link org.springframework.web.context.support.AnnotationConfigWebApplicationContext * AnnotationConfigWebApplicationContext}. A simple example with the former follows: @@ -59,23 +59,25 @@ import org.springframework.stereotype.Component; * // use myBean ... * * - * See {@link AnnotationConfigApplicationContext} Javadoc for further details and see + *

See the {@link AnnotationConfigApplicationContext} javadocs for further details, and see * {@link org.springframework.web.context.support.AnnotationConfigWebApplicationContext - * AnnotationConfigWebApplicationContext} for {@code web.xml} configuration instructions. + * AnnotationConfigWebApplicationContext} for web configuration instructions in a + * {@code Servlet} container. * *

Via Spring {@code } XML

* *

As an alternative to registering {@code @Configuration} classes directly against an * {@code AnnotationConfigApplicationContext}, {@code @Configuration} classes may be * declared as normal {@code } definitions within Spring XML files: - *

- * {@code
- * 
- *    
- *    
- * }
* - * In the example above, {@code } is required in order to + *
+ * <beans>
+ *    <context:annotation-config/>
+ *    <bean class="com.acme.AppConfig"/>
+ * </beans>
+ * 
+ * + *

In the example above, {@code } is required in order to * enable {@link ConfigurationClassPostProcessor} and other annotation-related * post processors that facilitate handling {@code @Configuration} classes. * @@ -86,11 +88,12 @@ import org.springframework.stereotype.Component; * Spring XML's {@code } element) and therefore may also take * advantage of {@link Autowired @Autowired}/{@link javax.inject.Inject @Inject} * like any regular {@code @Component}. In particular, if a single constructor is present - * autowiring semantics will be applied transparently: + * autowiring semantics will be applied transparently for that constructor: * *

  * @Configuration
  * public class AppConfig {
+ *
  *     private final SomeBean someBean;
  *
  *     public AppConfig(SomeBean someBean) {
@@ -112,15 +115,15 @@ import org.springframework.stereotype.Component;
  *     // various @Bean definitions ...
  * }
* - * See the {@link ComponentScan @ComponentScan} javadoc for details. + *

See the {@link ComponentScan @ComponentScan} javadocs for details. * *

Working with externalized values

* *

Using the {@code Environment} API

* - * Externalized values may be looked up by injecting the Spring + *

Externalized values may be looked up by injecting the Spring * {@link org.springframework.core.env.Environment} into a {@code @Configuration} - * class as usual (e.g. using the {@code @Autowired} annotation): + * class — for example, using the {@code @Autowired} annotation: * *

  * @Configuration
@@ -136,7 +139,7 @@ import org.springframework.stereotype.Component;
  *     }
  * }
* - * Properties resolved through the {@code Environment} reside in one or more "property + *

Properties resolved through the {@code Environment} reside in one or more "property * source" objects, and {@code @Configuration} classes may contribute property sources to * the {@code Environment} object using the {@link PropertySource @PropertySource} * annotation: @@ -154,12 +157,12 @@ import org.springframework.stereotype.Component; * } * } * - * See {@link org.springframework.core.env.Environment Environment} - * and {@link PropertySource @PropertySource} Javadoc for further details. + *

See the {@link org.springframework.core.env.Environment Environment} + * and {@link PropertySource @PropertySource} javadocs for further details. * *

Using the {@code @Value} annotation

* - * Externalized values may be 'wired into' {@code @Configuration} classes using + *

Externalized values may be injected into {@code @Configuration} classes using * the {@link Value @Value} annotation: * *

@@ -175,13 +178,23 @@ import org.springframework.stereotype.Component;
  *     }
  * }
* - * This approach is most useful when using Spring's + *

This approach is often used in conjunction with Spring's * {@link org.springframework.context.support.PropertySourcesPlaceholderConfigurer - * PropertySourcesPlaceholderConfigurer}, usually enabled via XML with - * {@code }. See the section below on composing - * {@code @Configuration} classes with Spring XML using {@code @ImportResource}, - * see {@link Value @Value} Javadoc, and see {@link Bean @Bean} Javadoc for details on working with - * {@code BeanFactoryPostProcessor} types such as + * PropertySourcesPlaceholderConfigurer} that can be enabled automatically + * in XML configuration via {@code } or explicitly + * in a {@code @Configuration} class via a dedicated {@code static} {@code @Bean} method + * (see "a note on BeanFactoryPostProcessor-returning {@code @Bean} methods" of + * {@link Bean @Bean}'s javadocs for details). Note, however, that explicit registration + * of a {@code PropertySourcesPlaceholderConfigurer} via a {@code static} {@code @Bean} + * method is typically only required if you need to customize configuration such as the + * placeholder syntax, etc. Specifically, if no bean post-processor (such as a + * {@code PropertySourcesPlaceholderConfigurer}) has registered an embedded value + * resolver for the {@code ApplicationContext}, Spring will register a default + * embedded value resolver which resolves placeholders against property sources + * registered in the {@code Environment}. See the section below on composing + * {@code @Configuration} classes with Spring XML using {@code @ImportResource}; see + * the {@link Value @Value} javadocs; and see the {@link Bean @Bean} javadocs for details + * on working with {@code BeanFactoryPostProcessor} types such as * {@code PropertySourcesPlaceholderConfigurer}. * *

Composing {@code @Configuration} classes

@@ -189,9 +202,9 @@ import org.springframework.stereotype.Component; *

With the {@code @Import} annotation

* *

{@code @Configuration} classes may be composed using the {@link Import @Import} annotation, - * not unlike the way that {@code } works in Spring XML. Because + * similar to the way that {@code } works in Spring XML. Because * {@code @Configuration} objects are managed as Spring beans within the container, - * imported configurations may be injected the usual way (e.g. via constructor injection): + * imported configurations may be injected — for example, via constructor injection: * *

  * @Configuration
@@ -220,7 +233,7 @@ import org.springframework.stereotype.Component;
  *     }
  * }
* - * Now both {@code AppConfig} and the imported {@code DatabaseConfig} can be bootstrapped + *

Now both {@code AppConfig} and the imported {@code DatabaseConfig} can be bootstrapped * by registering only {@code AppConfig} against the Spring context: * *

@@ -228,7 +241,7 @@ import org.springframework.stereotype.Component;
  *
  * 

With the {@code @Profile} annotation

* - * {@code @Configuration} classes may be marked with the {@link Profile @Profile} annotation to + *

{@code @Configuration} classes may be marked with the {@link Profile @Profile} annotation to * indicate they should be processed only if a given profile or profiles are active: * *

@@ -252,8 +265,8 @@ import org.springframework.stereotype.Component;
  *     }
  * }
* - * Alternatively, you may also declare profile conditions at the {@code @Bean} method level, - * e.g. for alternative bean variants within the same configuration class: + *

Alternatively, you may also declare profile conditions at the {@code @Bean} method level + * — for example, for alternative bean variants within the same configuration class: * *

  * @Configuration
@@ -268,16 +281,16 @@ import org.springframework.stereotype.Component;
  *     public DataSource productionDatabase() { ... }
  * }
* - * See the {@link Profile @Profile} and {@link org.springframework.core.env.Environment} + *

See the {@link Profile @Profile} and {@link org.springframework.core.env.Environment} * javadocs for further details. * *

With Spring XML using the {@code @ImportResource} annotation

* - * As mentioned above, {@code @Configuration} classes may be declared as regular Spring + *

As mentioned above, {@code @Configuration} classes may be declared as regular Spring * {@code } definitions within Spring XML files. It is also possible to * import Spring XML configuration files into {@code @Configuration} classes using * the {@link ImportResource @ImportResource} annotation. Bean definitions imported from - * XML can be injected the usual way (e.g. using the {@code Inject} annotation): + * XML can be injected — for example, using the {@code @Inject} annotation: * *

  * @Configuration
@@ -295,7 +308,7 @@ import org.springframework.stereotype.Component;
  *
  * 

With nested {@code @Configuration} classes

* - * {@code @Configuration} classes may be nested within one another as follows: + *

{@code @Configuration} classes may be nested within one another as follows: * *

  * @Configuration
@@ -317,11 +330,11 @@ import org.springframework.stereotype.Component;
  *     }
  * }
* - * When bootstrapping such an arrangement, only {@code AppConfig} need be registered + *

When bootstrapping such an arrangement, only {@code AppConfig} need be registered * against the application context. By virtue of being a nested {@code @Configuration} * class, {@code DatabaseConfig} will be registered automatically. This avoids * the need to use an {@code @Import} annotation when the relationship between - * {@code AppConfig} {@code DatabaseConfig} is already implicitly clear. + * {@code AppConfig} and {@code DatabaseConfig} is already implicitly clear. * *

Note also that nested {@code @Configuration} classes can be used to good effect * with the {@code @Profile} annotation to provide two options of the same bean to the @@ -337,13 +350,13 @@ import org.springframework.stereotype.Component; * *

Testing support for {@code @Configuration} classes

* - * The Spring TestContext framework available in the {@code spring-test} module - * provides the {@code @ContextConfiguration} annotation, which as of Spring 3.1 can - * accept an array of {@code @Configuration} {@code Class} objects: + *

The Spring TestContext framework available in the {@code spring-test} module + * provides the {@code @ContextConfiguration} annotation which can accept an array of + * {@code @Configuration} {@code Class} objects: * *

- * @RunWith(SpringJUnit4ClassRunner.class)
- * @ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class})
+ * @RunWith(SpringRunner.class)
+ * @ContextConfiguration(classes = {AppConfig.class, DatabaseConfig.class})
  * public class MyTests {
  *
  *     @Autowired MyBean myBean;
@@ -356,14 +369,16 @@ import org.springframework.stereotype.Component;
  *     }
  * }
* - * See TestContext framework reference documentation for details. + *

See the + * TestContext framework + * reference documentation for details. * *

Enabling built-in Spring features using {@code @Enable} annotations

* - * Spring features such as asynchronous method execution, scheduled task execution, + *

Spring features such as asynchronous method execution, scheduled task execution, * annotation driven transaction management, and even Spring MVC can be enabled and - * configured from {@code @Configuration} - * classes using their respective "{@code @Enable}" annotations. See + * configured from {@code @Configuration} classes using their respective "{@code @Enable}" + * annotations. See * {@link org.springframework.scheduling.annotation.EnableAsync @EnableAsync}, * {@link org.springframework.scheduling.annotation.EnableScheduling @EnableScheduling}, * {@link org.springframework.transaction.annotation.EnableTransactionManagement @EnableTransactionManagement}, @@ -406,15 +421,16 @@ import org.springframework.stereotype.Component; public @interface Configuration { /** - * Explicitly specify the name of the Spring bean definition associated - * with this Configuration class. If left unspecified (the common case), - * a bean name will be automatically generated. - *

The custom name applies only if the Configuration class is picked up via - * component scanning or supplied directly to a {@link AnnotationConfigApplicationContext}. - * If the Configuration class is registered as a traditional XML bean definition, - * the name/id of the bean element will take precedence. - * @return the suggested component name, if any (or empty String otherwise) - * @see org.springframework.beans.factory.support.DefaultBeanNameGenerator + * Explicitly specify the name of the Spring bean definition associated with the + * {@code @Configuration} class. If left unspecified (the common case), a bean + * name will be automatically generated. + *

The custom name applies only if the {@code @Configuration} class is picked + * up via component scanning or supplied directly to an + * {@link AnnotationConfigApplicationContext}. If the {@code @Configuration} class + * is registered as a traditional XML bean definition, the name/id of the bean + * element will take precedence. + * @return the explicit component name, if any (or empty String otherwise) + * @see AnnotationBeanNameGenerator */ @AliasFor(annotation = Component.class) String value() default ""; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java index 63c8d05a12..57f65c878c 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -30,7 +30,7 @@ import org.springframework.lang.Nullable; * In the general case, the keys are returned as a List containing one Map * for each row of keys. * - *

Most applications only use on key per row and process only one row at a + *

Most applications only use one key per row and process only one row at a * time in an insert statement. In these cases, just call {@code getKey} * to retrieve the key. The returned value is a Number here, which is the * usual type for auto-generated keys. diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/BeanPropertySqlParameterSourceTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/BeanPropertySqlParameterSourceTests.java index 4edec32b0c..952523d33f 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/BeanPropertySqlParameterSourceTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/BeanPropertySqlParameterSourceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2019 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. @@ -33,12 +33,12 @@ import static org.junit.Assert.*; public class BeanPropertySqlParameterSourceTests { @Test(expected = IllegalArgumentException.class) - public void withNullBeanPassedToCtor() throws Exception { + public void withNullBeanPassedToCtor() { new BeanPropertySqlParameterSource(null); } @Test(expected = IllegalArgumentException.class) - public void getValueWhereTheUnderlyingBeanHasNoSuchProperty() throws Exception { + public void getValueWhereTheUnderlyingBeanHasNoSuchProperty() { BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(new TestBean()); source.getValue("thisPropertyDoesNotExist"); } @@ -65,19 +65,19 @@ public class BeanPropertySqlParameterSourceTests { } @Test - public void hasValueWhereTheUnderlyingBeanHasNoSuchProperty() throws Exception { + public void hasValueWhereTheUnderlyingBeanHasNoSuchProperty() { BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(new TestBean()); assertFalse(source.hasValue("thisPropertyDoesNotExist")); } @Test(expected = IllegalArgumentException.class) - public void getValueWhereTheUnderlyingBeanPropertyIsNotReadable() throws Exception { + public void getValueWhereTheUnderlyingBeanPropertyIsNotReadable() { BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(new NoReadableProperties()); source.getValue("noOp"); } @Test - public void hasValueWhereTheUnderlyingBeanPropertyIsNotReadable() throws Exception { + public void hasValueWhereTheUnderlyingBeanPropertyIsNotReadable() { BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(new NoReadableProperties()); assertFalse(source.hasValue("noOp")); } diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSourceTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSourceTests.java index 7c92668930..7140c1722e 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSourceTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSourceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 the original author or authors. + * Copyright 2002-2019 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. @@ -29,18 +29,18 @@ import static org.junit.Assert.*; public class MapSqlParameterSourceTests { @Test - public void nullParameterValuesPassedToCtorIsOk() throws Exception { + public void nullParameterValuesPassedToCtorIsOk() { new MapSqlParameterSource(null); } @Test(expected = IllegalArgumentException.class) - public void getValueChokesIfParameterIsNotPresent() throws Exception { + public void getValueChokesIfParameterIsNotPresent() { MapSqlParameterSource source = new MapSqlParameterSource(); source.getValue("pechorin was right!"); } @Test - public void sqlParameterValueRegistersSqlType() throws Exception { + public void sqlParameterValueRegistersSqlType() { MapSqlParameterSource msps = new MapSqlParameterSource("FOO", new SqlParameterValue(2, "Foo")); assertEquals("Correct SQL Type not registered", 2, msps.getSqlType("FOO")); MapSqlParameterSource msps2 = new MapSqlParameterSource(); diff --git a/spring-oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java b/spring-oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java index 9f50a3ca09..53d26232b3 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -111,22 +111,25 @@ import org.springframework.util.xml.StaxUtils; * @author Juergen Hoeller * @author Rossen Stoyanchev * @since 3.0 - * @see #setContextPath(String) - * @see #setClassesToBeBound(Class[]) - * @see #setJaxbContextProperties(Map) - * @see #setMarshallerProperties(Map) - * @see #setUnmarshallerProperties(Map) - * @see #setSchema(Resource) - * @see #setSchemas(Resource[]) - * @see #setMarshallerListener(javax.xml.bind.Marshaller.Listener) - * @see #setUnmarshallerListener(javax.xml.bind.Unmarshaller.Listener) - * @see #setAdapters(XmlAdapter[]) + * @see #setContextPath + * @see #setClassesToBeBound + * @see #setJaxbContextProperties + * @see #setMarshallerProperties + * @see #setUnmarshallerProperties + * @see #setSchema + * @see #setSchemas + * @see #setMarshallerListener + * @see #setUnmarshallerListener + * @see #setAdapters */ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, GenericMarshaller, GenericUnmarshaller, BeanClassLoaderAware, InitializingBean { private static final String CID = "cid:"; + private static final EntityResolver NO_OP_ENTITY_RESOLVER = + (publicId, systemId) -> new InputSource(new StringReader("")); + /** Logger available to subclasses */ protected final Log logger = LogFactory.getLog(getClass()); @@ -243,8 +246,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi * Set the packages to search for classes with JAXB2 annotations in the classpath. * This is using a Spring-bases search and therefore analogous to Spring's component-scan * feature ({@link org.springframework.context.annotation.ClassPathBeanDefinitionScanner}). - *

Setting either this property, {@link #setContextPath "contextPath"} - * or {@link #setClassesToBeBound "classesToBeBound"} is required. + *

Setting either this property, {@link #setContextPath "contextPath"} or + * {@link #setClassesToBeBound "classesToBeBound"} is required. */ public void setPackagesToScan(@Nullable String... packagesToScan) { this.packagesToScan = packagesToScan; @@ -267,8 +270,9 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Set the JAXB {@code Marshaller} properties. These properties will be set on the - * underlying JAXB {@code Marshaller}, and allow for features such as indentation. + * Set the JAXB {@code Marshaller} properties. + *

These properties will be set on the underlying JAXB {@code Marshaller}, + * and allow for features such as indentation. * @param properties the properties * @see javax.xml.bind.Marshaller#setProperty(String, Object) * @see javax.xml.bind.Marshaller#JAXB_ENCODING @@ -281,8 +285,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Set the JAXB {@code Unmarshaller} properties. These properties will be set on the - * underlying JAXB {@code Unmarshaller}. + * Set the JAXB {@code Unmarshaller} properties. + *

These properties will be set on the underlying JAXB {@code Unmarshaller}. * @param properties the properties * @see javax.xml.bind.Unmarshaller#setProperty(String, Object) */ @@ -314,7 +318,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi /** * Specify the {@code XmlAdapter}s to be registered with the JAXB {@code Marshaller} - * and {@code Unmarshaller} + * and {@code Unmarshaller}. */ public void setAdapters(XmlAdapter... adapters) { this.adapters = adapters; @@ -335,7 +339,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Set the schema language. Default is the W3C XML Schema: {@code http://www.w3.org/2001/XMLSchema"}. + * Set the schema language. + * Default is the W3C XML Schema: {@code http://www.w3.org/2001/XMLSchema"}. * @see XMLConstants#W3C_XML_SCHEMA_NS_URI * @see XMLConstants#RELAXNG_NS_URI */ @@ -346,8 +351,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi /** * Set the resource resolver, as used to load the schema resources. * @see SchemaFactory#setResourceResolver(org.w3c.dom.ls.LSResourceResolver) - * @see #setSchema(Resource) - * @see #setSchemas(Resource[]) + * @see #setSchema + * @see #setSchemas */ public void setSchemaResourceResolver(LSResourceResolver schemaResourceResolver) { this.schemaResourceResolver = schemaResourceResolver; @@ -371,10 +376,11 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Specify whether the {@link #supports(Class)} returns {@code true} for the {@link JAXBElement} class. - *

Default is {@code false}, meaning that {@code supports(Class)} always returns {@code false} for - * {@code JAXBElement} classes (though {@link #supports(Type)} can return {@code true}, since it can - * obtain the type parameters of {@code JAXBElement}). + * Specify whether the {@link #supports(Class)} returns {@code true} for the + * {@link JAXBElement} class. + *

Default is {@code false}, meaning that {@code supports(Class)} always returns + * {@code false} for {@code JAXBElement} classes (though {@link #supports(Type)} can + * return {@code true}, since it can obtain the type parameters of {@code JAXBElement}). *

This property is typically enabled in combination with usage of classes like * {@link org.springframework.web.servlet.view.xml.MarshallingView MarshallingView}, * since the {@code ModelAndView} does not offer type parameter information at runtime. @@ -430,8 +436,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi * {@code Source} passed to {@link #unmarshal(Source)} is a {@link SAXSource} or * {@link StreamSource}. It has no effect for {@link DOMSource} or {@link StAXSource} * instances. - *

Note: setting this option to {@code true} also - * automatically sets {@link #setSupportDtd} to {@code true}. + *

Note: setting this option to {@code true} also automatically + * sets {@link #setSupportDtd} to {@code true}. */ public void setProcessExternalEntities(boolean processExternalEntities) { this.processExternalEntities = processExternalEntities; @@ -707,6 +713,21 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } } + /** + * Return a newly created JAXB marshaller. + *

Note: JAXB marshallers are not necessarily thread-safe. + */ + protected Marshaller createMarshaller() { + try { + Marshaller marshaller = getJaxbContext().createMarshaller(); + initJaxbMarshaller(marshaller); + return marshaller; + } + catch (JAXBException ex) { + throw convertJaxbException(ex); + } + } + private void marshalStaxResult(Marshaller jaxbMarshaller, Object graph, Result staxResult) throws JAXBException { XMLStreamWriter streamWriter = StaxUtils.getXMLStreamWriter(staxResult); if (streamWriter != null) { @@ -724,26 +745,14 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Return a newly created JAXB marshaller. JAXB marshallers are not necessarily thread safe. - */ - protected Marshaller createMarshaller() { - try { - Marshaller marshaller = getJaxbContext().createMarshaller(); - initJaxbMarshaller(marshaller); - return marshaller; - } - catch (JAXBException ex) { - throw convertJaxbException(ex); - } - } - - /** - * Template method that can be overridden by concrete JAXB marshallers for custom initialization behavior. - * Gets called after creation of JAXB {@code Marshaller}, and after the respective properties have been set. - *

The default implementation sets the {@link #setMarshallerProperties(Map) defined properties}, the {@link - * #setValidationEventHandler(ValidationEventHandler) validation event handler}, the {@link #setSchemas(Resource[]) - * schemas}, {@link #setMarshallerListener(javax.xml.bind.Marshaller.Listener) listener}, and - * {@link #setAdapters(XmlAdapter[]) adapters}. + * Template method that can be overridden by concrete JAXB marshallers + * for custom initialization behavior. Gets called after creation of JAXB + * {@code Marshaller}, and after the respective properties have been set. + *

The default implementation sets the + * {@link #setMarshallerProperties defined properties}, the + * {@link #setValidationEventHandler validation event handler}, the + * {@link #setSchemas schemas}, {@link #setMarshallerListener listener}, + * and {@link #setAdapters adapters}. */ protected void initJaxbMarshaller(Marshaller marshaller) throws JAXBException { if (this.marshallerProperties != null) { @@ -806,6 +815,21 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } } + /** + * Return a newly created JAXB unmarshaller. + *

Note: JAXB unmarshallers are not necessarily thread-safe. + */ + protected Unmarshaller createUnmarshaller() { + try { + Unmarshaller unmarshaller = getJaxbContext().createUnmarshaller(); + initJaxbUnmarshaller(unmarshaller); + return unmarshaller; + } + catch (JAXBException ex) { + throw convertJaxbException(ex); + } + } + protected Object unmarshalStaxSource(Unmarshaller jaxbUnmarshaller, Source staxSource) throws JAXBException { XMLStreamReader streamReader = StaxUtils.getXMLStreamReader(staxSource); if (streamReader != null) { @@ -872,27 +896,14 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Return a newly created JAXB unmarshaller. - * Note: JAXB unmarshallers are not necessarily thread-safe. - */ - protected Unmarshaller createUnmarshaller() { - try { - Unmarshaller unmarshaller = getJaxbContext().createUnmarshaller(); - initJaxbUnmarshaller(unmarshaller); - return unmarshaller; - } - catch (JAXBException ex) { - throw convertJaxbException(ex); - } - } - - /** - * Template method that can be overridden by concrete JAXB marshallers for custom initialization behavior. - * Gets called after creation of JAXB {@code Marshaller}, and after the respective properties have been set. - *

The default implementation sets the {@link #setUnmarshallerProperties(Map) defined properties}, the {@link - * #setValidationEventHandler(ValidationEventHandler) validation event handler}, the {@link #setSchemas(Resource[]) - * schemas}, {@link #setUnmarshallerListener(javax.xml.bind.Unmarshaller.Listener) listener}, and - * {@link #setAdapters(XmlAdapter[]) adapters}. + * Template method that can be overridden by concrete JAXB marshallers + * for custom initialization behavior. Gets called after creation of JAXB + * {@code Marshaller}, and after the respective properties have been set. + *

The default implementation sets the + * {@link #setUnmarshallerProperties defined properties}, the + * {@link #setValidationEventHandler validation event handler}, the + * {@link #setSchemas schemas}, {@link #setUnmarshallerListener listener}, + * and {@link #setAdapters adapters}. */ protected void initJaxbUnmarshaller(Unmarshaller unmarshaller) throws JAXBException { if (this.unmarshallerProperties != null) { @@ -917,8 +928,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } /** - * Convert the given {@code JAXBException} to an appropriate exception from the - * {@code org.springframework.oxm} hierarchy. + * Convert the given {@code JAXBException} to an appropriate exception + * from the {@code org.springframework.oxm} hierarchy. * @param ex {@code JAXBException} that occurred * @return the corresponding {@code XmlMappingException} */ @@ -1079,8 +1090,4 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, Generi } } - - private static final EntityResolver NO_OP_ENTITY_RESOLVER = - (publicId, systemId) -> new InputSource(new StringReader("")); - } diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index c3d35d4b55..33f2ca1e94 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -60,6 +60,8 @@ import org.springframework.util.StringUtils; *

  • {@link #set(String, String)} sets the header value to a single string value
  • * * + *

    Note that {@code HttpHeaders} generally treats header names in a case-insensitive manner. + * * @author Arjen Poutsma * @author Sebastien Deleuze * @author Brian Clozel diff --git a/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java b/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java index 3b885f39bb..0b86523081 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java +++ b/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -52,14 +52,14 @@ public class CorsConfiguration { /** Wildcard representing all origins, methods, or headers. */ public static final String ALL = "*"; - private static final List DEFAULT_METHODS = - Collections.unmodifiableList(Arrays.asList(HttpMethod.GET, HttpMethod.HEAD)); + private static final List DEFAULT_METHODS = Collections.unmodifiableList( + Arrays.asList(HttpMethod.GET, HttpMethod.HEAD)); - private static final List DEFAULT_PERMIT_ALL = - Collections.unmodifiableList(Arrays.asList(ALL)); + private static final List DEFAULT_PERMIT_METHODS = Collections.unmodifiableList( + Arrays.asList(HttpMethod.GET.name(), HttpMethod.HEAD.name(), HttpMethod.POST.name())); - private static final List DEFAULT_PERMIT_METHODS = - Collections.unmodifiableList(Arrays.asList(HttpMethod.GET.name(), HttpMethod.HEAD.name(), HttpMethod.POST.name())); + private static final List DEFAULT_PERMIT_ALL = Collections.unmodifiableList( + Collections.singletonList(ALL)); @Nullable @@ -322,22 +322,21 @@ public class CorsConfiguration { return this.maxAge; } + /** * By default a newly created {@code CorsConfiguration} does not permit any * cross-origin requests and must be configured explicitly to indicate what * should be allowed. - * *

    Use this method to flip the initialization model to start with open * defaults that permit all cross-origin requests for GET, HEAD, and POST * requests. Note however that this method will not override any existing * values already set. - * *

    The following defaults are applied if not already set: *

      - *
    • Allow all origins.
    • - *
    • Allow "simple" methods {@code GET}, {@code HEAD} and {@code POST}.
    • - *
    • Allow all headers.
    • - *
    • Set max age to 1800 seconds (30 minutes).
    • + *
    • Allow all origins.
    • + *
    • Allow "simple" methods {@code GET}, {@code HEAD} and {@code POST}.
    • + *
    • Allow all headers.
    • + *
    • Set max age to 1800 seconds (30 minutes).
    • *
    */ public CorsConfiguration applyPermitDefaultValues() { @@ -361,23 +360,19 @@ public class CorsConfiguration { /** * Combine the non-null properties of the supplied * {@code CorsConfiguration} with this one. - * *

    When combining single values like {@code allowCredentials} or * {@code maxAge}, {@code this} properties are overridden by non-null * {@code other} properties if any. - * *

    Combining lists like {@code allowedOrigins}, {@code allowedMethods}, * {@code allowedHeaders} or {@code exposedHeaders} is done in an additive * way. For example, combining {@code ["GET", "POST"]} with * {@code ["PATCH"]} results in {@code ["GET", "POST", "PATCH"]}, but keep * in mind that combining {@code ["GET", "POST"]} with {@code ["*"]} * results in {@code ["*"]}. - * *

    Notice that default permit values set by * {@link CorsConfiguration#applyPermitDefaultValues()} are overridden by * any value explicitly defined. - * - * @return the combined {@code CorsConfiguration} or {@code this} + * @return the combined {@code CorsConfiguration}, or {@code this} * configuration if the supplied configuration is {@code null} */ @Nullable diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java index d2fb559bef..008271169d 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java @@ -140,16 +140,8 @@ import org.springframework.web.servlet.view.tiles3.TilesConfigurer; import org.springframework.web.servlet.view.tiles3.TilesViewResolver; import org.springframework.web.util.UrlPathHelper; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; /** * Tests loading actual MVC namespace configuration. @@ -176,7 +168,7 @@ public class MvcNamespaceTests { @Before - public void setUp() throws Exception { + public void setup() throws Exception { TestMockServletContext servletContext = new TestMockServletContext(); appContext = new XmlWebApplicationContext(); appContext.setServletContext(servletContext); @@ -347,6 +339,7 @@ public class MvcNamespaceTests { } @Test + @SuppressWarnings("unchecked") public void testResources() throws Exception { loadBeanDefinitions("mvc-config-resources.xml");